参考代码:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) {
return res;
}
Deque<TreeNode> stack = new LinkedList<TreeNode>();
TreeNode prev = null;
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if (root.right == null || root.right == prev) {
res.add(root.val);
prev = root;
root = null;
} else {
stack.push(root);
root = root.right;
}
}
return res;
}
}
运用迭代的方法。
与前中序遍历不同的是,遍历到左子树的最左端时,对于右孩子的处理需要分情况。
与前中序遍历一样,当
while (root != null) {
stack.push(root);
root = root.left;
}
都进入栈时,
9出栈并写入list,此时prev.val=9,root=null。
再次循环,3出栈,但是3的右孩子不为空,所以3再次进栈,
紧接着,4进栈,5进栈,5出栈并写入list,4出栈,4的右孩子不为空,4再次进栈,7进栈,7出栈并写入list,4出栈并写入list,3出栈并写入list。
此题中值得注意的是prev和root=null的运用,prev标记已经写入list的root,而root=null,是为了让上一节点出栈,获取其右孩子并使其入栈,然后进行再次进栈操作,让上一节点依旧在栈中,并未被写入list。