Day13 | 二叉树的层序遍历10题

74 阅读3分钟

二叉树的层序遍历 LeetCode 102

题目链接:[LeetCode 102 - 中等]

思路

层序遍历

迭代(借助队列):

class Solution {
    public List<List<Integer>> result = new ArrayList<>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        check(root);
        return result;
    }
    public void check(TreeNode node){
        if(node==null) return;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(node);
        while(!que.isEmpty()){
            List<Integer> res = new ArrayList<>();
            int len = que.size();

            while(len>0){
                TreeNode tmp = que.poll();
                res.add(tmp.val);
                if(tmp.left!=null)que.offer(tmp.left);
                if(tmp.right!=null)que.offer(tmp.right);
                len--;
            }
            result.add(res);
        }
    }
}

二叉树的层序遍历Ⅱ LeetCode 107

题目链接:[LeetCode 107 - 中等]

思路

层序遍历

迭代(借助队列):

class Solution {
    public List<List<Integer>> result = new ArrayList<>();
    
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        check(root);
        return result;
    }
    private void check(TreeNode node){
        if(node==null)return;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(node);
        while(!que.isEmpty()){
            List<Integer> res = new ArrayList<>();
            int len = que.size();
            while(len>0){
                TreeNode tmp = que.poll();
                res.add(tmp.val);
                if(tmp.left!=null)que.offer(tmp.left);
                if(tmp.right!=null)que.offer(tmp.right);
                len--;
            }
            result.add(0,res);
        }
    }
}

思考

相较于102 有一个List的反转操作,体现在代码上的为:result.add(0,res);的修改

二叉树的右视图 LeetCode 199

题目链接:[LeetCode 199 - 中等]

思路

层序遍历

迭代(借助队列):

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root==null)return result;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            while(len>0){
                TreeNode node = que.poll();
                if(len==1){
                    result.add(node.val);
                }
                if(node.left!=null)que.offer(node.left);
                if(node.right!=null)que.offer(node.right);
                len--;
            }
        }
        return result;
    }
}

二叉树的层平均值 LeetCode 637

题目链接:[LeetCode 637 - 中等]

思路

层序遍历

迭代(借助队列):

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> result = new ArrayList<>();
        if(root==null)return result;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            double average = 0.0;
            int len = que.size();
            for(int i=len;i>0;i--){
                TreeNode node = que.poll();
                average += node.val;
                if(node.left!=null)que.offer(node.left);
                if(node.right!=null)que.offer(node.right);
            }
            average /= len;
            result.add(average);
        }
        return result;
    }
}

思考

当时仍然使用while(len>0)会导致最后的时候len变为0,发生java.lang.RuntimeException: Infinite or NaN异常

N叉树的层序遍历 LeetCode 429

题目链接:[LeetCode 429 - 中等]

思路

层序遍历

迭代(借助队列):

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> result = new ArrayList<>();
        if(root==null) return result;
        Queue<Node> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            List<Integer> res = new ArrayList<>();
            while(len>0){
                Node node = que.poll();
                res.add(node.val);
                if(node.children!=null||node.children.size()>0){
                    for(Node child:node.children){
                        if(child!=null){
                            que.offer(child);
                        }
                    }
                }
                len--;
            }
            result.add(res);
        }
        return result;
    }
}

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

题目链接:[LeetCode 515 - 中等]

思路

层序遍历

迭代(借助队列):

class Solution {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root==null)return result;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int max = Integer.MIN_VALUE;
            int len = que.size();
            while(len>0){
                TreeNode node = que.poll();
                max = Math.max(max,node.val);
                if(node.left!=null)que.offer(node.left);
                if(node.right!=null)que.offer(node.right);
                len--;
            }
            result.add(max);
        }
        return result;
    }
}

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

题目链接:[LeetCode 116 - 中等]

思路

层序遍历

迭代(借助队列):

class Solution {
    public Node connect(Node root) {
        Node head = new Node();
        head.left = root;
        if(root==null)return root;
        Queue<Node> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            while(len>0){
                Node cur = que.poll();
                if(len!=1){
                    cur.next = que.peek();
                }
                if(cur.left!=null)que.add(cur.left);
                if(cur.right!=null)que.add(cur.right);
                len--;
            }
        }
        return head.left;
    }
}

填充每个节点的下一个右侧节点指针Ⅱ LeetCode 117

题目链接:[LeetCode 117 - 中等]

思路

Ⅰ与Ⅱ的思路一致。

迭代(借助队列):

class Solution {
    public Node connect(Node root) {
        if(root==null)return root;
        Queue<Node> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            while(len>0){
                Node cur = que.poll();
                if(len!=1){
                    cur.next = que.peek();
                }
                if(cur.left!=null)que.add(cur.left);
                if(cur.right!=null)que.add(cur.right);
                len--;
            }
        }
        return root;
    }
}

二叉树的最大深度 LeetCode 104

题目链接:[LeetCode 104 - 简单]

思路

迭代(借助队列):

class Solution {
    public int maxDepth(TreeNode root) {
        int max = 0;
        if(root==null)return max;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            while(len>0){
                TreeNode node = que.poll();
                if(node.left!=null)que.offer(node.left);
                if(node.right!=null)que.offer(node.right);
                len--;
            }
            max++;
        }
        return max;
    }
}

总结

注意递归与遍历的顺序

二叉树的最小深度 LeetCode 111

题目链接:[LeetCode 111 - 简单]

思路

如何判断叶子节点 - 如何设置退出条件

递归:

class Solution {
    public int minDepth(TreeNode root) {
        int min = 0;
        if(root==null)return min;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            min++;
            while(len>0){
                TreeNode node = que.poll();
                if(node.left==null&&node.right==null){
                    que.clear();
                    break;
                }
                if(node.left!=null)que.offer(node.left);
                if(node.right!=null)que.offer(node.right);
                len--;
            }
            
        }
        return min;
    }
}

总结

1.如何判断叶子节点 node.left==null&&node.right==null

2.如何设置退出条件 que.clear(); break;