二叉树的后序遍历

递归写法


 public int[] postorderTraversal (TreeNode root) {
        // write code here
         List<Integer> list=new ArrayList<Integer>();
        dfs(list,root);
        int[] res=new int[list.size()];
        for(int i=0;i<list.size();i++){
            res[i]=list.get(i);
        }
        return res;
    }
    public void dfs(List<Integer> list,TreeNode root){
        if (root==null) return;
        dfs(list,root.left);
        dfs(list,root.right);
        list.add(root.val);
    }

非递归写法

两个栈的写法

 public int[] postorderTraversal (TreeNode root) {
        // write code here

        if(root==null) return new int[0];

        Deque<TreeNode> stack1=new LinkedList<TreeNode>();
        Deque<Integer> stack2=new LinkedList<Integer>();
        stack1.push(root);
        while (stack1.isEmpty()){
            TreeNode p=stack1.pop();
            stack2.push(p.val);
            if (p.left!=null) stack1.push(p.left);
            if(p.right!=null) stack1.push(p.right);

        }
        int l=stack2.size();
        int[] res=new int[l];
        for (int i=0;i<l;i++){
            res[i]=stack2.pop();
        }
        return res;
    }



一个栈

 public int[] postorderTraversal (TreeNode root) {
        // write code here
        if(root==null) return new int[0];

        Deque<TreeNode> stack=new LinkedList<>();
        List<Integer> list=new ArrayList<>();

        TreeNode t=root;
        TreeNode c=root;
        stack.push(t);
        while (!stack.isEmpty()){
            t=stack.peek();
            if(t.left!=null&&c!=t.left&&c!=t.right){
                stack.push(t.left);
            }else if(t.right!=null&&c!=t.right){
                stack.push(t.right);
            }else {
                list.add(t.val);
                stack.pop();
                c=t;
            }
        }

        int[] res=new int[list.size()];
        for (int i=0;i<res.length;i++){
            res[i]=list.get(i);
        }
        return res;
    }
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务