非递归实现二叉树遍历

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

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,也可以说是处理这个节点的顺序

目录
相关文章
|
8月前
二叉树遍历及应用
二叉树遍历及应用
89 0
|
7月前
|
存储 算法 编译器
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
48 0
|
8月前
搜索二叉树(二叉搜索树)的实现(递归与非递归)
搜索二叉树(二叉搜索树)的实现(递归与非递归)
|
8月前
|
存储
LeetCode题94,44,145,二叉树的前中后序遍历,非递归
LeetCode题94,44,145,二叉树的前中后序遍历,非递归
67 0
|
8月前
【二叉树遍历和练习】
【二叉树遍历和练习】
64 0
|
存储 算法 JavaScript
算法系列-二叉树遍历(非递归实现)
在内卷潮流的席卷下,身为算法小白的我不得不问自己,是否得踏上征程,征服这座巍巍高山。 从零开始,终点不知何方,取决于自己可以坚持多久。 希望你可以和我一样,克服恐惧,哪怕毫无基础,哪怕天生愚钝,依然选择直面困难。
|
存储 算法
【数据结构与算法】二叉树的非递归前中后序遍历
【数据结构与算法】二叉树的非递归前中后序遍历
【数据结构与算法】二叉树的非递归前中后序遍历