1.根节点入栈
2.将根节点的左子树入栈,直到最左,没有左孩子为止
3.得到栈顶元素的值,先不访问,判断栈顶元素是否存在右孩子,如果存在并且没有被访问,则将右孩子入栈,否则,就访问栈顶元素
其关键就在于需要一个前驱指针,用于判断是否该节点的右节点被访问过。
public void postOrder(Node Root) {
if(Root==null) {
System.out.println("空树");
return;
}
Node tmp=Root; //当前节点
Node prev=null; //上一次访问的节点
Stack s=new Stack();
while(tmp!=null || !s.empty()) {
//1.将根节点及其左孩子入栈
while(tmp!=null) {
s.push(tmp);
tmp=tmp.leftChild;
}
if(!s.empty()) {
//2.获取栈顶元素值
tmp=s.peek();
//3.没有右孩子,或者右孩子已经被访问过
if(tmp.rightChild==null || tmp.rightChild==prev) {
//则可以访问栈顶元素
tmp=s.pop();
System.out.print(tmp.data+" ");
//标记上一次访问的节点
prev=tmp;
tmp=null;
}
//4.存在没有被访问的右孩子
else {
tmp=tmp.rightChild;
}
}
}
System.out.println();
}