码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树前序、中序、后序遍历(非递归统一解法)

时间:2020-07-13 15:41:18      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:blog   非递归   bin   实现   int   pop   结束   成功   指定   

前言

昨天和今天复习了二叉树的前序遍历、中序遍历和后序遍历,找到了一种统一的非递归的方法(即使用一个思路非递归实现二叉树的前序、中序和后序遍历)。

思路

思路本质上还是递归,只不过不通过递归函数显式递归,而是通过栈模拟递归。

具体思路:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/mo-fang-di-gui-zhi-bian-yi-xing-by-sonp/

注意:

  • 非空的树节点指针才能存入栈中

    因为使用nullptr作为递归函数结束的标志,所以在栈中存储树节点指针时必须要检查是否非空。

  • 遍历顺序和入栈顺序相反

前序遍历

LeetCode题目:https://www.cnblogs.com/chouxianyu/p/13290758.html

vector<int> preorderTraversal(TreeNode* root){
    vector<int> result;
    stack<TreeNode*> nodes;
    if(root!=nullptr)
        nodes.push(root);

    while(!nodes.empty()){
        // 取出节点
        root = nodes.top();
        nodes.pop();
        // 将节点对应的树拆解成前序,模拟递归解法中的函数调用
        if(root!=nullptr){
            if(root->right!=nullptr)
                nodes.push(root->right);
            if(root->left!=nullptr)
                nodes.push(root->left);
            nodes.push(root);
            nodes.push(nullptr);  // 设置nullptr标志
        }
        // nullptr代表栈顶对应的树(根、左子树、右子树)已按照指定顺序遍历,一层递归函数运行结束
        else{
            result.push_back(nodes.top()->val);
            nodes.pop();
        }
    }
    return result;
}

中序遍历

LeetCode题目:https://www.cnblogs.com/chouxianyu/p/13293153.html

vector<int> inorderTraversal(TreeNode* root) {
    vector<int> result;
    stack<TreeNode*> nodes;
    if(root!=nullptr)
        nodes.push(root);
    while(!nodes.empty()){
        root = nodes.top();
        nodes.pop();
        // 模拟调用递归函数
        if(root!=nullptr){
            if(root->right!=nullptr)
                nodes.push(root->right);
            nodes.push(root);
            nodes.push(nullptr);
            if(root->left!=nullptr)
                nodes.push(root->left);
        }
        // 一层递归函数结束
        else{
            result.push_back(nodes.top()->val);
            nodes.pop();
        }
    }
    return result;
}

后序遍历

LeetCode题目:https://www.cnblogs.com/chouxianyu/p/13293152.html

vector<int> postorderTraversal(TreeNode* root){
    vector<int> result;
    stack<TreeNode*> nodes;
    if(root!=nullptr)
        nodes.push(root);
    while(!nodes.empty()){
        root = nodes.top();
        nodes.pop();
        // 模拟调用递归函数
        if(root!=nullptr){
            nodes.push(root);
            nodes.push(nullptr);
            if(root->right!=nullptr)
                nodes.push(root->right);
            if(root->left!=nullptr)
                nodes.push(root->left);
        }
        // 递归函数调用成功
        else{
            result.push_back(nodes.top()->val);
            nodes.pop();
        }
    }
    return result;
}

作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


二叉树前序、中序、后序遍历(非递归统一解法)

标签:blog   非递归   bin   实现   int   pop   结束   成功   指定   

原文地址:https://www.cnblogs.com/chouxianyu/p/13293284.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!