给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
本文使用迭代法实现二叉树的遍历,对于当前节点,其左孩子和右孩子都被访问之后,才能访问当前节点。我们可以使用pre指向上一次访问的节点,若当前节点的左右孩子都访问过,则访问当前节,否则继续向孩子节点遍历。我们使用辅助栈来实现。
public List<Integer> postorderTraversal(TreeNode root) {
Stack<TreeNode> stack =new Stack();
List<Integer> list=new ArrayList();
TreeNode cur=root;
TreeNode pre=null;
while(!stack.isEmpty()||cur!=null){
while(cur!=null){ //找到节点的最左边节点
stack.push(cur);
cur=cur.left;
}
cur=stack.pop(); //无左孩子弹出栈顶节点
if(cur.right==null||cur.right==pre){ // 判断栈顶节点的右孩子是否被访问过或者为空
list.add(cur.val);
pre=cur;
cur=null;
}else{ //没有访问过,将弹出的栈顶重新入栈 当前节点指向右孩子
stack.push(cur);
cur=cur.right;
}
}
return list;
}