/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
if(root==null) return list;
//通过这个节点,判断是否有右子树
TreeNode pre=null;
Stack<TreeNode> stack=new Stack<TreeNode>();
while(root!=null||!stack.isEmpty()){
//这里一路把左子树入栈了
while(root!=null){
stack.push(root);
root=root.left;
}
//这里出栈的肯定是当前左子树的 最后一个节点
root=stack.pop();
//2、判断当前节点有没有右子树,
//如果==null,那说明没有右子树,可以彻底出栈了,
//如果==pre,说明右子树在它之前就出栈了,那它也可以出栈了
if(root.right==null||root.right==pre){
list.add(root.val);
//1、每次都把当前节点记录下来
pre=root;
//到这里,当前节点 root下的子树都处理完了,不需要再左子树入栈了,所以要给root=null
//这样,当再次while时,跳过左子树入栈,直接将root的上一级节点出栈,进行下一步操作
root=null;
}else{
stack.push(root);
root=root.right;
}
}
return list;
}
}
二叉树迭代后序遍历
最新推荐文章于 2023-10-28 15:46:52 发布