zoukankan      html  css  js  c++  java
  • 二叉树前序、中序、后序遍历(非递归统一解法)

    前言

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

    思路

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

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

    欢迎讨论和交流!


  • 相关阅读:
    python--DAY7面向对象进阶
    python--socket实例
    Python---day5-各类模块的使用
    python--day4--迭代器、生成器
    Python--三元运算与lambda表达式
    python--函数式登录程序
    Python--变量作用域
    Python--函数
    Python----文件的IO操作
    swagger2文档的步骤
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/13293284.html
Copyright © 2011-2022 走看看