在前序非递归遍历、中序和后序,后序是最棘手的问题。如果我们只保留指向堆栈中的指针,这是不够的。堆栈中必须存储一些额外的信息。
有很多方法。这里只有一个。首先,定义堆栈节点的数据结构。

复制代码代码如下所示:
typedef struct {节点p;int rvisited;}斯诺德 / /节点的二叉树的节点结构,并rvisited = = 1已由节点指向正确的节点访问P.

lastordertraverse(bitree BT){
首先,从根节点到左下角,一直向前走,堆栈中每个节点的路径。
= bt;
当(bt){
推(BT,0);在堆栈中推送两个信息,一个是节点指针,第一个是它的右节点是否已被访问。
BT = bt.lchild;
}

循环的主体,然后输入
当(堆栈为空){(!)只要堆栈不是空的
锡(Sn)= stack.gettop; / /是栈顶节点

/ /注,任意一个节点n,只要他有离开的孩子,在N组,N把孩子也必须遵循堆栈(这体现在算法的后期),所以当我们到堆栈的顶部,可以肯定的是,这个元素或无左孩子,或者把孩子已经被访问过了,所以现在我们不关心它的左孩子,我们只关心孩子的权利。

如果已经访问了正确的子元素,或者元素具有正确的子元素,则通过遍历定义,这可以是访问节点。
如果(sn.p.rchild | | {锡。rvisited!)
p = POP();
访问(P);
}
别人/ /如果其右孩子存在,rvisited是0,没有合适的孩子,然后去正确的孩子。
{
这一次,我们想让它的右子节点一直留在下面,直到最后,这个路径上的所有节点都是堆栈。

/ /当然,在节点rvisited设置为1栈,因为它的右孩子堆栈意味着孩子们将访问权之前(这是很好理解的,因为我们总是删除元素从栈顶的访问)。因此,下一次的元素在堆栈的顶部,右边的孩子会被路过的访问,所以rvisited可以设置为1。
sn.rvisited = 1;

到左下角结束时,堆栈中所有元素的路径。
P = sn.p.rchild;
而(P!= 0){
推(p,0);
P = p.lchild;
}
这一轮已经结束了,那些节点只是堆栈,我们没有它,下一个周期将很好地照顾这些节点。
}
}