zoukankan      html  css  js  c++  java
  • 二叉树的统一迭代遍历

    二叉树的统一迭代遍历

    题目链接

    144.二叉树的前序遍历(简单)

    94.二叉树的中序遍历(简单)

    145.二叉树的后序遍历(简单)

    题解

    思路:以中序遍历为例,在二叉树的迭代遍历中提到说使用栈的话,无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况

    现在将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。

    如何标记呢,就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记。 这种方法也可以叫做标记法。

    如下所示是带有标记的迭代中序遍历:

    中序遍历(统一迭代法)

    代码(C++):

    //中序遍历(统一迭代)
    class Solution2 {
    public:
        vector<int> inorderTraversal(TreeNode* root) {
            stack<TreeNode*> sta;
            vector<int> result;
            if (root == nullptr) return result;
            else sta.push(root);
            while (!sta.empty()) {
                TreeNode* node = sta.top();
                if (node != nullptr) {
                    sta.pop(); //先将该节点弹出,避免重复操作
                    //遍历顺序:右-中null-左
                    //右节点不为空时入栈
                    if (node->right != nullptr) sta.push(node->right);
                    //中间节点+标记 入栈 (中间节点访问过,但是还未处理)
                    sta.push(node);
                    sta.push(nullptr);
                    //左节点不为空时入栈
                    if (node->left != nullptr) sta.push(node->left);
                } else { //当前节点为空时,将下一结果放入结果中
                    sta.pop();
                    result.push_back(sta.top()->val);
                    sta.pop();
                }
            }
            return result;
        }
    };

    前序遍历(统一迭代法)

    代码(C++):

    //前序遍历(统一迭代)
    class Solution1 {
    public:
        vector<int> preorderTraversal(TreeNode* root) {
            stack<TreeNode*> sta;
            vector<int> result;
            if (root != nullptr) sta.push(root);
            while (!sta.empty()) {
                TreeNode* node = sta.top();
                if (node != nullptr) {
                    sta.pop();
                    //遍历顺序:右-左-中null
                    if (node->right != nullptr) sta.push(node->right);
                    if (node->left != nullptr) sta.push(node->left);
                    sta.push(node);
                    sta.push(nullptr);
                } else {
                    sta.pop();
                    result.push_back(sta.top()->val);
                    sta.pop();
                }
            }
            return result;
        }
    };

    后序遍历(统一迭代法)

    代码(C++):

    //后序遍历(统一迭代)
    class Solution3 {
    public:
        vector<int> postorderTraversal(TreeNode* root) {
            stack<TreeNode*> sta;
            vector<int> result;
            if (root != nullptr) sta.push(root);
            while (!sta.empty()) {
                TreeNode* node = sta.top();
                if (node != nullptr) {
                    //遍历顺序:中null-右-左
                    sta.push(nullptr);
                    if (node->right != nullptr) sta.push(node->right);
                    if (node->left != nullptr) sta.push(node->left);
                } else {
                    sta.pop();
                    result.push_back(sta.top()->val);
                    sta.pop();
                }
            }
            return result;
        }
    };

    参考链接

    代码随想录

  • 相关阅读:
    Linux Commands
    sizeof操作符的使用详解
    在Vim中使用cscope
    MySQL学习笔记
    Online judge for leetcode
    使用Vim,让你工作效率更高
    Ext JS笔记
    安装J2EE开发环境
    这些都是什么啊
    QrCode二维码的实现原理
  • 原文地址:https://www.cnblogs.com/wltree/p/15606475.html
Copyright © 2011-2022 走看看