二叉树的遍历

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

//前序遍历
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;
    }
};
全部评论

相关推荐

就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
06-07 12:20
新余学院 Java
点赞 评论 收藏
分享
求offer的大角牛:不吃香菜
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务