其核心思想就是每次的父节点都要入栈两次,确认其右儿子已经被访问过或者为空后才能被访问
void postOrder2 ( BTree t ) {
// pcur 为当前访问的结点, plast 为上一个已经 print 的结点
BTree stack[100];
int top = -1;
BTree pcur = t, plast = NULL;
if ( !t ) {
return;
}
while ( pcur ) {
stack[++top] = pcur;
pcur = pcur->leftChild;
}
while ( top >= 0 ) {
// 此时, pcur 是“最左边”的结点,如果他没有右节点或者右节点已经被访问了,就可以访问他
pcur = stack[top];
top--;
if ( pcur->rightChild == NULL || plast == pcur->rightChild ) {
printf("%d ", pcur->value);
plast = pcur;
}
else {
// push pcur into stack again
stack[++top] = pcur;
pcur = pcur->rightChild;
while ( pcur ) {
stack[++top] = pcur;
pcur = pcur->leftChild;
}
}
}
printf("\n");
}
Python solution
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root:
return []
s = []
travel = []
pcur = root
plast = None
while pcur:
s.append(pcur)
pcur = pcur.left
while s:
pcur = s.pop()
if not pcur.right or plast == pcur.right:
travel.append(pcur.val)
plast = pcur
else:
s.append(pcur)
pcur = pcur.right
while pcur:
s.append(pcur)
pcur = pcur.left
return travel