美文网首页数据结构
数据结构题目41:二叉树的后序遍历(非递归)

数据结构题目41:二叉树的后序遍历(非递归)

作者: 玲儿珑 | 来源:发表于2020-05-11 18:18 被阅读0次

题目:若二叉树为二叉链表存储结构,写出二叉树的后序遍历的非递归算法。

解题思路:当指针p指向某一个结点时,不能马上对它进行访问,而要先遍历它的左子树,因而要将此结点的地址进栈;当其左子树遍历完毕之后,再次搜索到该结点时(该结点的地址通过退栈得到),还不能对它进行访问,还需要遍历它的右子树,所以,再一次将此结点的地址进栈。只要当该结点的右子树被遍历后回到该结点,才访问该结点。为了标明某结点是否可以被访问,引入一个标志变量flag,并有 flag=0 表示该结点暂不访问,flag=1 表示该结点可以访问。标志flag的值随同进栈结点的地址一起进栈和出栈。因此算法中有两个stack,使用同一栈顶指针top。

具体算法如下:
这里使用到建立二叉树方法createBT(strBT)

function postOrder1(BT) {
    let stack1=new Array(MaxSize), p=BT, stack2=new Array(MaxSize), flag, top=-1
    if ( BT!=null ) {
        do {
            while ( p!=null ) {
                stack1[++top] = p
                stack2[top] = 0
                p = p.lchild
            }
            p = stack1[top]
            flag = stack2[top--]
            if ( flag==0 ) {
                stack1[++top] = p
                stack2[top] = 1
                p = p.rchild
            } else {
                console.log(p.data)
                p = null
            }
        } while ( !(p==null && top==-1) );
    }
}

var strBT="A(B(D,E(G)),C(F(,H)))@"
var BT = createBT(strBT)
postOrder1(BT)

相关文章

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • Leetcode-145题:Binary Tree Postor

    题目 非递归后序遍历 代码

  • 二叉树的四种遍历方法

    二叉树的数据结构 1、前序遍历(递归) 2、中序遍历(递归) 3、后序遍历(递归) 4、层次遍历(队列)

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

  • 二叉树,非递归法

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

  • 算法之二叉树

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

  • LeetCode 二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历。 非递归(迭代): 后序遍历递归定义:先左子树,后右子树,再根节点。 后序遍...

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

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

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • 各种二叉树遍历

    C++实现,二叉树的递归、非递归版本的前序、中序、后序遍历。

网友评论

    本文标题:数据结构题目41:二叉树的后序遍历(非递归)

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