public List<Integer> postorderTraversa(TreeNode root) {
Stack<TreeNode> s = new Stack<>();
List<Integer> res = new ArrayList<>();
// 用来表示前一个访问的点是什么
TreeNode pre = null;
while (root != null && s.size() != 0) {
// 这个循环结束之后 左子树已经访问完毕
while (root != null){
s.push(root);
root = root.left;
}
// 取出左子树的节点
root = s.pop();
// 如果一个节点的又子树为空 或者是又子树已经访问过了 就需要将该节点加入到结果集里面
// 对于第一个节点来说 一定出现的是那种又子树为空的情况,这时候就将该节点设置为已经访问过的那个
//
if(root.right == null || root.right==pre){
res.add(root.val);
// 设置该节点为当前访问过的节点 也就是前驱节点
pre = root;
root = null;
}else {
// 如果一个节点的右子树不为空且没有访问过,加入该节点 并访问其又子树节点
s.push(root);
root = root.right;
}
}
return res;
}
10-18
942
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)