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