Day15 二叉树

目录

层序遍历

107. 二叉树的层序遍历 II

 199. 二叉树的右视图

637. 二叉树的层平均值

429. N 叉树的层序遍历

 515. 在每个树行中找最大值

 116. 填充每个节点的下一个右侧节点指针

104. 二叉树的最大深度

111. 二叉树的最小深度

226. 翻转二叉树

101. 对称二叉树


层序遍历

107. 二叉树的层序遍历 II

状态:完成

思路:我这样写也可以做出来,最方便的办法肯定就是正向的层序遍历之后把答案翻转,还有一种不用翻转用LinkedList这个链表添加到头就行了。

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        if(root==null) return list;
        Stack<TreeNode> stack=new Stack<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(queue.size()!=0){
            int size =queue.size();
            for(int i=0;i<size;i++){
                TreeNode temp =queue.poll();
                stack.push(temp);
                if(temp.right!=null) queue.add(temp.right);
                if(temp.left!=null) queue.add(temp.left);
            }
            stack.push(null);
        }
        stack.pop();
        while(stack.size()>0){
            List<Integer> tempList = new ArrayList<>();
            TreeNode node=stack.pop(); 
            while(node!=null){
                tempList.add(node.val);
                if(stack.size()==0) break;
                node=stack.pop();
            }
            list.add(tempList);
        }
        return list;
    }
}

 199. 二叉树的右视图

状态:完成

思路:其实这题就是层序遍历的最后一个值的集合,所以只要把每一层的最后一个节点写进结果数组中就可以。

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        TreeNode node =root;
        List<Integer> list = new ArrayList<>();
        if(root==null) return list;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        while(queue.size()>0){
            int size=queue.size();
            for(int i=0;i<size;i++){
                node=queue.poll();
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
            }
            list.add(node.val);
        }
        return list;
    }
}

637. 二叉树的层平均值

状态:完成

思路:就是把每一层加起来除以每一层的个数

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        TreeNode node =root;
        List<Double> list = new ArrayList<>();
        if(root==null) return list;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        while(queue.size()>0){
            int size=queue.size();
            double sum=0;
            double nums=0;
            for(int i=0;i<size;i++){
                node=queue.poll();
                sum+=node.val;
                nums++;
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
            }
            list.add((double)sum/(double)nums);
        }
        return list;
    }
}

429. N 叉树的层序遍历

状态:完成

思路:把层序节点添加队列左右节点换成list的遍历

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> list=new ArrayList<>();
        if(root==null) return list;
        Queue<Node> queue=new LinkedList<>();
        queue.add(root);
        while(queue.size()>0){
            int size=queue.size();
            ArrayList<Integer> list2 = new ArrayList<>();
            for(int i=0;i<size;i++){
                Node node= queue.poll();
                for(Node a:node.children){
                    queue.add(a);
                }
                list2.add(node.val);
            }
            list.add(list2);
        }
        return list;
    }
}

 515. 在每个树行中找最大值

状态:完成

思路:层序遍历中把每一行的最大值找到放进去

class Solution {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        if(root==null) return list;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        while(queue.size()>0){
            int size=queue.size();
            int max=Integer.MIN_VALUE;
            for(int i=0;i<size;i++){
                TreeNode node= queue.poll();
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
                max=max>node.val?max:node.val;
            }
            list.add(max);
        }
        return list;
    }
}

 116. 填充每个节点的下一个右侧节点指针

状态:完成

思路:在层序遍历过程中链接右节点就可以了。

class Solution {
    public Node connect(Node root) {
        List<List<Integer>> list=new ArrayList<>();
        if(root==null) return root;
        Queue<Node> queue=new LinkedList<>();
        queue.add(root);
        while(queue.size()>0){
            int size=queue.size();
            ArrayList<Integer> list2 = new ArrayList<>();
            Node node=null;
            for(int i=0;i<size;i++){
                if(node!=null){
                    node.next=queue.poll();
                    node= node.next;
                }else{
                    node=queue.poll();
                }
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
            }
        }
        return root;
    }
}

104. 二叉树的最大深度

状态:完成

思路:层序遍历算有多少层

class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null) return 0;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        int index=0;
        while(queue.size()>0){
            int size=queue.size();
            for(int i=0;i<size;i++){
                TreeNode node= queue.poll();
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
            }
           index++;
        }
        return index;
    }
}

111. 二叉树的最小深度

状态:完成

思路:什么时候左右节点都是空的什么时候返回这时的层数+1。

class Solution {
    public int minDepth(TreeNode root) {
        if(root==null) return 0;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        int index=0;
        while(queue.size()>0){
            int size=queue.size();
            for(int i=0;i<size;i++){
                TreeNode node= queue.poll();
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
                if(node.left==null&&node.right==null){
                    return index+1;
                }
            }
            index++;
        }
        return index;
    }
}

226. 翻转二叉树

层序遍历翻转二叉树:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null) return root;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        while(queue.size()>0){
            int size=queue.size();
            for(int i=0;i<size;i++){
                TreeNode node=queue.poll();
                TreeNode temp=node.left;
                node.left=node.right;
                node.right=temp;
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
            }
        }
        return root;
    }
}

前、后序翻转:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null) return root;
        TreeNode temp=root.left;
        root.left=root.right;
        root.right=temp;
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}

中序翻转时此时的左节点是右节点所以遍历原先右节点时是现在左节点

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null) return root;
        
        invertTree(root.left);
        TreeNode temp=root.left;
        root.left=root.right;
        root.right=temp;
        invertTree(root.left);
        return root;
    }
}

101. 对称二叉树

状态:层序遍历检测完成,后序遍历看讲解能理解意思

思路:层序遍历就是从层的两侧向中间去遍历,如果两侧的值不一样或者有空的值就肯定不是对称的。后序遍历感觉就是前序遍历的两个方向中左,中右这两个方向,周末休息的时候实现一下。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        List<List<Integer>> list=new ArrayList<>();
        if(root==null) return false;
        Queue<TreeNode> queue=new LinkedList<>();
        if(root.left!=null&&root.right!=null){
            queue.add(root.left);
            queue.add(root.right);
        }else{
            if(root.left==null&&root.right==null){
                return true;
            }
            return false;
        }
        while(queue.size()>0){
            int size=queue.size();
            for(int i=0;i<size/2;i++){
                TreeNode left=queue.poll();
                TreeNode right=queue.poll();
                if(left.val!=right.val) return false;
                if(left.left!=null&&right.right!=null){
                    queue.add(left.left);
                    queue.add(right.right);
                }
                if(left.left==null&&right.right!=null) return false;
                if(left.left!=null&&right.right==null) return false;
                
                if(left.right!=null&&right.left!=null){
                    queue.add(left.right);
                    queue.add(right.left);
                }
                if(left.right==null&&right.left!=null) return false;
                if(left.right!=null&&right.left==null) return false;
            }
        }
        return true;
    }
}

感想:二叉树之前没怎么做过,给我感觉挺灵活的,有时候没想到可以这样子做,而且很多数据结构也用到了二叉树,比如堆,周末我想总结一下java各个常用的数据结构的方法的时间复杂度。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值