算法思想:
后序遍历二叉树的顺序是左右根。我们需要用一个辅助栈来记录没有访问过得祖宗节点。借助一个简单的二叉树模拟一下过程。
后序遍历的顺序是DEBFGCA
算法步骤
1.沿着根的左孩子,依次入栈,直到左孩子为空。此时栈内的元素依次是ABD
2.读取栈顶元素,若其右孩子不为空且从来没有被访问过,将右子树执行步骤1,否则弹出栈顶元素并访问。
栈顶D的右孩子为空,出栈并访问,此时栈顶元素为B,有右孩子且未被访问过,将E入栈,E没有右孩子,访问并出栈,此时B的右孩子已经被访问过了,访问B并出栈,此时的栈顶元素A不空且没有被访问过,CF入栈,F的右孩子为空,访问并出栈,C的右孩子不为空,G入栈,G没有右孩子,访问G并出栈,此时C的右孩子已经被访问,访问C并出栈。最后访问A节点,栈为空,结束遍历。
伪代码
void postOrder(BiTree T){
InitStack(S);
p=T;
r=NULL;
while(p||!isEmpty(S)){
if(p){
push(S,p);
p=p->left;
}
else{
GetTop(S,p);
if(p->right&&p->right!=r){
p=p->right;
}
else{
pop(S,p);
visit(p->data);
r=p;
p=NULL;
}
}
}
}