美文网首页
二叉树遍历的非递归实现

二叉树遍历的非递归实现

作者: 九楼记 | 来源:发表于2022-05-05 20:53 被阅读0次

前序遍历

https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
前序遍历:root、root->left、root->right
非递归实现需要一个辅助栈

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
            vector<int> ret;
            if (root == nullptr) {
                return ret;
            }
            stack<TreeNode*> stk;
            stk.push(root);
            while (!stk.empty()) {
                TreeNode* cur = stk.top();
                stk.pop();
                ret.push_back(cur->val);
                if (cur->right) {
                    stk.push(cur->right);
                }
                if (cur->left) {
                    stk.push(cur->left);
                }
            }
            return ret;
    }
};

中序遍历

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
中序遍历:root->left、root、root->right
非递归实现需要一个辅助栈

vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ret;
        if (root == nullptr) {
            return ret;
        }
        stack<TreeNode*> stk;
        TreeNode* mov = root;
        while (mov != nullptr || !stk.empty()) {
            while (mov != nullptr) {
                stk.push(mov);
                mov = mov->left;
            }
            if (!stk.empty()) {
                TreeNode* cur = stk.top();
                stk.pop();
                ret.push_back(cur->val);
                mov = cur->right;
            }
        }
        return ret;
    }

后序遍历

https://leetcode-cn.com/problems/binary-tree-postorder-traversal/
后序遍历:root->left、root->right、root
非递归实现需要一个辅助栈
具体过程:要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> stk;
        vector<int> ret;
        if (root == NULL) {
            return ret;
        }
        TreeNode* pre = NULL;
        stk.push(root);
        while (!stk.empty()) {
            TreeNode* cur = stk.top();
            if ((cur->left == NULL && cur->right == NULL) || (pre != NULL && (pre == cur->left || pre == cur->right))) {
                ret.push_back(cur->val);
                pre = cur;
                stk.pop();
            } else {
                if (cur->right) {
                    stk.push(cur->right);
                }
                if (cur->left) {
                    stk.push(cur->left);
                }
            }
        }
        return ret;
    }
};

Reference

[1] https://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
[2] https://leetcode-cn.com/circle/article/dn75YS/

相关文章

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • Java二叉树的遍历

    Java二叉树的遍历 利用递归和非递归实现二叉树的先序,中序,后序遍历以及使用队列实现二叉树的层次遍历

  • 二叉树的遍历实现递归与非递归

    本文实现了二叉树的深度遍历算法,分为递归与非递归 递归的实现非常简单,基本上没啥难度 非递归的实现需要根据遍历的顺...

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • 二叉树的各类遍历方法

    二叉树的遍历主要有四种:前序、中序、后序、层序。 遍历的实现方式主要是:递归和非递归。递归遍历的实现非常容易,非递...

  • 二叉树遍历java,非递归、层次。

    /** * 前序遍历 * 递归 */ /*** 前序遍历* 非递归*/ 后续遍历非递归 二叉树层次遍历基于java...

  • 数据结构-树的遍历

    1. 先序遍历 递归实现 非递归实现 2. 中序遍历 递归实现 非递归实现 3. 后序遍历 递归实现 非递归实现 ...

  • 二叉树递归非递归遍历算法整理

    一、二叉树前序遍历 1 前序递归遍历 2.前序非递归遍历 一、二叉树中序遍历 2.中序递归遍历 1.中序非递归遍历...

网友评论

      本文标题:二叉树遍历的非递归实现

      本文链接:https://www.haomeiwen.com/subject/fajoyrtx.html