非递归实现二叉树遍历

简介: 非递归实现二叉树遍历

Traversal

注意stack弹出的顺序决定是如何遍历


先序

思路

  1. 取二叉树根节点入栈
  2. pop栈顶数据Top
  3. 先入Top右,再入Top

重复2、3步骤,直到栈为空


实现

void PreOrderUnRecur(Node* root)
{
    if(root != null)
    {
        stack<Node*> cons;
        cons.push(root);
        while(!cons.empty())
        {
            Node* Top = cons.top();
            cons.pop();
            cout << Top->value << " ";
            if(Top->right) cons.push(Top->right);
            if(Top->left) cons.push(Top->left);
        }
    }
}


后序

思路

使用两个栈 conshelp

  1. 根节点入栈cons
  2. pop数据Tophelp
  3. 先入Top左,再入Top右,均入cons

重复步骤2、3,直到cons没有数据,依次拿出help中的数据


实现

void PostOrderUnRecur(Node* root)
{
    if(root != null)
    {
        stack<Node*> cons;
        stack<Node*> help;
        cons.push(root);
        while(!cons.empty())
        {
            Node* Top = cons.top();
            cons.pop();
            help.push(Top);
            if(Top->left) cons.push(Top->left);
            if(Top->right) cons.push(Top->right);
        }
        while(!help.empty())
        {
            Node* val = help.top();
            help.pop();
            cont << val->value << " ";
        }
    }
}


总结

栈入数据的顺序是和弹出时的顺序是相反的。

弹出的顺序即决定是先序遍历还是后续遍历

先序遍历 -- -- 头左右 -- -- 要求入栈顺序:头右左

后序遍历 -- -- 左右头 -- -- 要求入栈顺序:头左右 -- -- 得到出栈顺序:头右左 -- -- help反转出栈顺序


中序

思路

首先根节点的所有左节点入栈

  • pop节点Top,把Top节点的右子树的左节点入栈

重复上面的步骤,直到栈为空


实现

void InOrderUnRecur(Node* root)
{
    if(root != nullptr)
    {
        stack<Node*> cons;
        Node* cur = root;
        while(!cons.empty() || cur != nullptr)
        {
            if(cur == nullptr)
            {
                Node* Top = cons.top();
                cons.pop();
                cout << Top->value <<" ";
                cur = Top->right;
            }
            else
            {
                cons.push(cur);
                cur = cur->left;
            }
        }
    }
}


总结

对于一个节点Node和它的左节点LNode、右节点RNode,出栈的顺序: LNode -> Node -> RNode,也可以说是处理这个节点的顺序

目录
相关文章
|
6月前
二叉树遍历及应用
二叉树遍历及应用
75 0
|
5天前
|
算法
非递归实现后序遍历的时间复杂度是多少?
虽然非递归实现后序遍历的时间复杂度与递归实现相同,但在空间复杂度和一些特定场景下的性能表现等方面可能会有所不同,具体使用哪种方式还需要根据实际情况进行权衡。
|
5天前
|
存储
非递归实现后序遍历的空间复杂度是多少?
综上所述,非递归实现后序遍历的空间复杂度在不同实现方式下有所不同,但总体上与二叉树的高度相关,最坏情况下为 $O(n)$,最好情况下为 $O(\log_2 n)$。
|
6月前
|
存储
LeetCode题94,44,145,二叉树的前中后序遍历,非递归
LeetCode题94,44,145,二叉树的前中后序遍历,非递归
61 0
|
6月前
【二叉树遍历和练习】
【二叉树遍历和练习】
55 0
|
存储 算法 JavaScript
算法系列-二叉树遍历(非递归实现)
在内卷潮流的席卷下,身为算法小白的我不得不问自己,是否得踏上征程,征服这座巍巍高山。 从零开始,终点不知何方,取决于自己可以坚持多久。 希望你可以和我一样,克服恐惧,哪怕毫无基础,哪怕天生愚钝,依然选择直面困难。
【C++】非递归实现二叉树的前中后序遍历
【C++】非递归实现二叉树的前中后序遍历
【C++】非递归实现二叉树的前中后序遍历
|
算法 Java C++
详解二叉树遍历(C/C++)
文章目录 目录 文章目录 一、先序遍历 1.知识点概述 2.图片理解 ​编辑 3.代码 二、中序遍历 1.知识点概述 2.图片理解 3.代码 三、后序遍历 1.知识点概念 2.图片理解 3.代码 四、层序遍历 1.知识点概述 2.图片理解 3.代码 五、二叉树的建立 1.补空法 六、二叉树的还原 1.算法步骤 2.代码 总结(二叉树的四种遍历代码)
302 0
详解二叉树遍历(C/C++)