AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

树的三种遍历的非递归写法

作者: 作者的头像   nihaotian ,  2019-07-25 22:02:14 ,  所有人可见 ,  阅读 2495


17


27

有关树的遍历的非递归网上有很多了,这里把三种写法总结成类似的模板形式,方便记忆。

先序遍历

使用stack辅助运算先序遍历的顺序是“根-左-右”,算法为:

  1. 将根节点push到栈中
  2. 循环检测栈是否为空,若不空,则取出栈顶元素,保存其值,然后看其右子节点是否存在,若存在,则push到栈中。再看其左子节点,若存在,则push到栈中。
class solution{
    public:
        vector<int> preorderTraversal(TreeNode* root){
            vector<int>res;
            stack<TreeNode*>s;
            TreeNode *p = root;
            while(!s.empty() || p){
                if(p){ //若p节点存在
                    s.push(p); //将p加入栈中
                    res.push_back(p->val); //将p的节点值保存到res中
                    p = p->left; //指向下一个左子节点
                }
                else{// 若p节点不存在
                    TreeNode* t = s.top(); //取出栈顶节点
                    s.pop();
                    p = t->right; //将p指向栈顶节点的右子节点
                }
            }
            return res;
        }
};

中序遍历

从根节点开始,先将根节点压入栈,然后再将其所有左子结点压入栈,然后取出栈顶结点,保存结点值,再将其指针移到右子节点上,若存在右子结点,则在下次循环中又可以将其所有左子结点压入栈中,这样就保证了访问顺序为左-根-右。

vector<int> InorderTraversal(TreeNode* root){
    vector<int>res;
    stack<TreeNode*>s;
    TreeNode *p = root;
    while(!s.empty() || p){
        if(p){
            s.push(p);
           p = p->left;
        }
        else{
            p = s.top();
            s.pop();
            res.push_back(p->val);
            p = p->right;
        }
    }
    return res;
}

后序遍历

先将先序遍历的根-左-右变成根-右-左,再翻转变为左-右-根,翻转方式为改变结构res的加入顺序,然后把更新辅助结点p的左右顺序换一下。

vector<int> PostorderTraversal(TreeNode* root){
    vector<int>res;
    stack<TreeNode*>s;
    TreeNode *p = root;
    while(!s.empty() || p){
        if(p){
            s.push(p);
            res.insert(res.begin(),p->val);
            p = p->right;
        }
        else{
            TreeNode *t = s.top()
            s.pop();
            p = t->left;
        }
        return res;
    }
}

4 评论


用户头像
Yida915   2019-09-21 10:42      1    踩      回复

简洁易懂易记!


用户头像
有P选P   2023-11-09 21:21         踩      回复

后序遍历您的版本是最简洁的


用户头像
tgs   2020-05-07 10:31         踩      回复

强


用户头像
达达   2019-07-26 10:40         踩      回复

总结的简洁实用,赞!


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息