非递归实现二叉树遍历

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

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月前
二叉树遍历及应用
二叉树遍历及应用
74 0
|
6月前
|
存储
LeetCode题94,44,145,二叉树的前中后序遍历,非递归
LeetCode题94,44,145,二叉树的前中后序遍历,非递归
57 0
|
6月前
【二叉树遍历和练习】
【二叉树遍历和练习】
55 0
|
存储 算法 JavaScript
算法系列-二叉树遍历(非递归实现)
在内卷潮流的席卷下,身为算法小白的我不得不问自己,是否得踏上征程,征服这座巍巍高山。 从零开始,终点不知何方,取决于自己可以坚持多久。 希望你可以和我一样,克服恐惧,哪怕毫无基础,哪怕天生愚钝,依然选择直面困难。
【C++】非递归实现二叉树的前中后序遍历
【C++】非递归实现二叉树的前中后序遍历
【C++】非递归实现二叉树的前中后序遍历
|
数据采集 算法
数据结构与算法—二叉树的层序、前序中序后序(递归、非递归)遍历
层序遍历。听名字也知道是按层遍历。我们知道一个节点有左右节点。而每一层一层的遍历都和左右节点有着很大的关系。也就是我们选用的数据结构不能一股脑的往一个方向钻,而左右应该均衡考虑。这样我们就选用队列来实现。
198 0
数据结构与算法—二叉树的层序、前序中序后序(递归、非递归)遍历
|
算法 Java C++
详解二叉树遍历(C/C++)
文章目录 目录 文章目录 一、先序遍历 1.知识点概述 2.图片理解 ​编辑 3.代码 二、中序遍历 1.知识点概述 2.图片理解 3.代码 三、后序遍历 1.知识点概念 2.图片理解 3.代码 四、层序遍历 1.知识点概述 2.图片理解 3.代码 五、二叉树的建立 1.补空法 六、二叉树的还原 1.算法步骤 2.代码 总结(二叉树的四种遍历代码)
299 0
详解二叉树遍历(C/C++)
|
算法 搜索推荐
从二叉树的前中后序遍历,我们来说递归和快速排序
从二叉树的前中后序遍历,我们来说递归和快速排序
从二叉树的前中后序遍历,我们来说递归和快速排序