循环要点:先右孩子再左孩子进站
右孩子为空或访问过就退栈,退栈时进行访问
用一个指针t指向上一个访问过的节点
1.根节点进站
2.左右孩子有一个被访问过,并且左右都为空进行退栈操作,否则进行进站
public static List<Integer> postorderTraversal(TreeNode root) {
//用集合来接
List<Integer> list = new ArrayList<>();
//设置栈,用一个t来指向上一个访问过的数据
if(root == null)
return list;
Stack<TreeNode> stack = new Stack<>();
TreeNode t = root ;
stack.push(root);
//循环直至栈为空
while(!stack.isEmpty()){
//左右孩子有一个被访问过,并且左右都为空进行退栈操作,否则进行进站
if(stack.peek().right==t||stack.peek().left==t||stack.peek().right==null&&stack.peek().left==null){
//使用t一直指向上一个访问过的元素
t = stack.peek();
list.add(t.val);
stack.pop();
}else{
//先右后左
TreeNode tr = stack.peek();
if(tr.right!= null)
stack.push(tr.right);
if(tr.left!= null)
stack.push(tr.left);
}
}
return list;
}
3.循环2直至栈为空