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

Posted chouxianyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树前序中序后序遍历(非递归统一解法)相关的知识,希望对你有一定的参考价值。

前言

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

思路

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

具体思路: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/

欢迎讨论和交流!


以上是关于二叉树前序中序后序遍历(非递归统一解法)的主要内容,如果未能解决你的问题,请参考以下文章

二叉树中,啥是前序,中序。后序!

二叉树前序中序后序遍历相互求法

二叉树前序中序后序遍历相互求法

C语言数据结构,急求在线二叉树先序中序后序递归遍历

基础备忘 二叉树前序中序后序遍历相互求法

二叉树前序中序和后序遍历的非递归实现