二叉树的遍历

二叉树的遍历:
三种递归遍历:

//前序遍历
void preorder(TreeNode *root, vector<int> &path)
{
    if(root != NULL)
    {
        path.push_back(root->val);
        preorder(root->left, path);
        preorder(root->right, path);
    }
}
//中序遍历
void inorder(TreeNode *root, vector<int> &path)
{
    if(root != NULL)
    {
        inorder(root->left, path);
        path.push_back(root->val);
        inorder(root->right, path);
    }
}
//后续遍历
void postorder(TreeNode *root, vector<int> &path)
{
    if(root != NULL)
    {
        postorder(root->left, path);
        postorder(root->right, path);
        path.push_back(root->val);
    }
}
非递归:
//非递归前序遍历
void preorderTraversal(TreeNode *root, vector<int> &path){
    stack<TreeNode *> s;
    TreeNode *p = root;
    while(p != NULL || !s.empty())
    {
        while(p != NULL)
        {
            path.push_back(p->val);
            s.push(p);
            p = p->left;
        }
        if(!s.empty())
        {
            p = s.top();
            s.pop();
            p = p->right;
        }
    }
}
//非递归中序遍历
void inorderTraversal(TreeNode *root, vector<int> &path){
    stack<TreeNode *> s;
    TreeNode *p = root;
    while(p != NULL || !s.empty())
    {
        while(p != NULL)
        {
            s.push(p);
            p = p->left;
        }
        if(!s.empty())
        {
            p = s.top();
            path.push_back(p->val);
            s.pop();
            p = p->right;
        }
    }
}


后序非递归遍历:
vector<int> postorderTraversal(TreeNode* root) {
    vector<int> v;
    if(root==nullptr)
        return v;
    stack<TreeNode*> s;
    TreeNode *cur=root;
    TreeNode *pre=nullptr;                  //修改1,增加指向前一结点的指针
    while(cur || !s.empty()){
        while(cur){
            s.push(cur);
            cur=cur->left;
        }
        cur=s.top();
        if(cur->right==nullptr || cur->right==pre){     //修改二,增加判断是否该输出结点
            v.push_back(cur->val);
            s.pop();
            pre=cur;
            cur=nullptr;
        }
        else
            cur=cur->right;
    }
    return v;
}
//层次遍历:如果不需要确定当前遍历到了哪一层,模板如下:
vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> ret;
        if (!root) return ret;
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            TreeNode *node = q.front();
            q.pop();
            ret.push_back(node->val);

            if (node->left) q.push(node->left);
            if (node->right) q.push(node->right);
        }
        return ret;
    }
//如果需要知道到了那一层,代码如下:
vector<int> PrintFromTopToBottom(TreeNode* root) {
        int level=0;
        vector<int> ret;
        if (!root) return ret;
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {

            int sz=q.size();
            while(sz--){
                TreeNode *node = q.front(); 
                q.pop();
                ret.push_back(node->val);
                if (node->left) q.push(node->left);
                if (node->right) q.push(node->right);
            }
            level++;
        }
        return ret;
    }

作者:xyTen
链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/er-cha-shu-hou-xu-fei-di-gui-bian-li-liang-chong-z/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
![图片说明](https://uploadfiles.nowcoder.com/images/20200927/369376673_1601195901210_226A34B686DBDD3B86D0D591CB41B069 "图片标题") 

vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        vector<TreeNode*> s;
        int sum=0;
        vector<vector<int> > v1;
        vector<int> v2;
        if(root==nullptr) return v1;
        TreeNode* cur =root;
        TreeNode* pre =nullptr;
        while(cur!=nullptr || !s.empty()){
            while(cur!=nullptr){
                s.push_back(cur);
                v2.push_back(cur->val);
                sum+=cur->val;
                cur=cur->left;
            }
            cur=s.back();
            if(cur->right==nullptr || cur->right==pre){
                if(cur->left==nullptr && cur->right==nullptr && sum==expectNumber){
                    v1.push_back(v2);
                }
                s.pop_back();
                pre=cur;
                sum-=cur->val;
                v2.pop_back();
                cur=nullptr;
            }
            else{
                cur=cur->right;
            }

        }
        return v1;
    }

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    void mid(TreeNode* p,int a,int &b){
        if(p!=nullptr){
            a+=1;
            if(b==0 && p->right==nullptr && p->left==nullptr){
                b=a;
            }
            else if(b!=0 && p->right==nullptr && p->left==nullptr){
                if(a<b){
                    b=a;
                }
            }
            mid(p->left,a,b);            
            mid(p->right,a,b);
        }
    }

    int minDepth(TreeNode* root) {
        int a=0;
        int b=0;
        mid(root,a,b);
        return b;
    }
};
全部评论

相关推荐

想润的芹菜人狠话不多:把其中一个老总放中间都会得罪另一个
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务