这里主要回顾后序遍历算法的主要非递归思想:
后序遍历可以由前序遍历经过一系列操作推得
如图:
该二叉树的前序遍历为:1 2 4 8 5 9 3 6 10 11 7 12 13
首先找到根节点的左右两边的子树分别以2和3为根,将2和3为根的子树全部按原顺序交换
所以是2 4 8 5 9和3 6 10 11 7 12 13整体交换可以得到
1 3 6 10 11 7 12 13 2 4 8 5 9 接着交换以4,5,6,7为根的子树(这里特别注意!若子树的孩子节点只有一个则可以不用交换)
得到:
1 3 7 13 12 6 11 10 2 5 9 4 8
最后将整个序列全部反转,这里我用到的是将这个序列放入一个栈中,然后再出栈就可以起到逆序的作用了
8 4 9 5 2 10 11 6 12 13 7 3 1
代码可写为:
void post_order_Nonrecursion(Node *node) { if(node!=NULL) { Node *stack1[MAXSIZE];int top1=-1; Node *stack2[MAXSIZE];int top2=-1; Node *p=NULL; stack1[++top1]=node; while(top1!=-1) { p=stack1[top1--]; stack2[++top2]=p; if(p->left!=NULL) stack1[++top1]=p->left; if(p->right!=NULL) stack1[++top1]=p->right; } while(top2!=-1) { p=stack2[top2--]; printf("%d ",p->data); } } }