算法思想
-
借助堆栈实现前序遍历、中序遍历非递归程序的本质是利用堆栈模拟递归函数调用时的入栈和出栈过程。而前序遍历、中序遍历和后序遍历在递归函数执行时,结点(作为函数参数)的入栈和出栈过程是完全一样的。
-
前序遍历是在结点入栈时输出结点信息,然后开始分别对该结点左右子树的遍历;而在中序遍历中,结点出栈时表明刚完成对该结点左子树的遍历,此时可输出该结点信息。
-
后序遍历必须在左右子树均输出的情况下才能输出该结点。如果直接采用前序遍历、中序遍历的非递归程序,我们没法判别该结点的右子树什么时候遍历结束。为了能知道结点右子树什么时候遍历结束,可以在其左子树遍历结束时做个标记(暂不出栈),等到再次访问到它时说明其右子树刚刚遍历完毕,此时可以输出该结点。
中序遍历
- 遇到一个结点,就把它压栈 ,并去遍历它的左子树
- 当左子树遍历结束 后,从栈顶弹出这个结点并访问它
- 然后按其右指针再去中序遍历该结点的右子树
// 中序遍历非递归算法
void InOrderTraversal(BinTree BT)
{
BinTree T = BT;
Stack S = CreatStack(MaxSize); // 创建并初始化堆栈S
while (T || !IsEmpty(S))
{
while (T)
{
// 一直向左并将沿途结点压入堆栈
Push(S, T