二叉树的统一迭代遍历

二叉树的统一迭代遍历

题目链接

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;
    }
};

参考链接

代码随想录

posted @ 2021-11-26 10:31  wltree  阅读(103)  评论(0编辑  收藏  举报