day14-二叉树的深度遍历

递归法

核心就是下边三个顺序的区别

        list.add(cur.val);//1
        preorder(cur.left,list);//2
        preorder(cur.right,list);//3

123 前序

213 中序

231 后序

迭代法

前序遍历

    public static List<Integer> preorderTraversal2(TreeNode root){

        ArrayList list = new ArrayList();
        Deque que = new LinkedList();
        if(root==null) return list;

        que.push(root);

        while(!que.isEmpty()) {
            TreeNode tmp = (TreeNode) que.pop();
            if(tmp!=null && tmp.right!=null) que.push(tmp.right);
            if(tmp!=null && tmp.left!=null)  que.push(tmp.left);
            list.add(tmp.val);
        }
        return list;
    }

中序

写了2个,第一个原创,第二个模仿

//stack
    public static List<Integer> inorderTraversal2(TreeNode root) {
        List list = new ArrayList<>();
        Deque que = new LinkedList();
        if(root==null)  return list;

        que.push(root);
        while(!que.isEmpty()){
            TreeNode tmp = (TreeNode) que.peek();
            if(tmp!=null){
                que.push(tmp.left);
            }else{
                que.pop();// 这里是push出去 上个循环的null节点  不是不行,但是逻辑复杂了
                if(!que.isEmpty()) {
                    TreeNode tmp1 = (TreeNode) que.pop();
                    list.add(tmp1.val);
                    que.push(tmp1.right);
                }
            }
        }
        return list;
    }

    public static List<Integer> inorderTraversal3(TreeNode root) {
        List list = new ArrayList<>();
        Deque que = new LinkedList();
        if(root==null)  return list;

        TreeNode tmp = root;
        while(tmp!=null || !que.isEmpty()){

            if(tmp!=null){
                que.push(tmp);
                tmp = tmp.left;//先移动,不push进去,就可以解决 inorderTraversal2中的复杂
            }else{
                    tmp = (TreeNode) que.pop();
                    list.add(tmp.val);
                    tmp=tmp.right;
            }
        }
        return list;
    }

后序

    public static List<Integer> postorderTraversal2(TreeNode root) {
        ArrayList list = new ArrayList();
        Deque que = new LinkedList();
        if(root==null) return list;

        que.push(root);

        while(!que.isEmpty()) {
            TreeNode tmp = (TreeNode) que.pop();

            if(tmp!=null && tmp.left!=null)  que.push(tmp.left);
            if(tmp!=null && tmp.right!=null) que.push(tmp.right);
            list.add(tmp.val);
        }
        Collections.reverse(list);
        return list;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值