【算法刷题 | 二叉树 03】3.22 二叉树的层序遍历02(5题:在每个树行中找最大值,填充每个节点的下一个右侧节点指针,二叉树的最大深度,最小深度)

文章目录

5.6 515_在每个树行中找最大值

5.6.1问题

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

  • 示例一:
复制代码
输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

5.6.2解法:层序遍历

java 复制代码
class Solution {
    public List<Integer> largestValues(TreeNode root) {
        Queue<TreeNode> queue=new LinkedList<>();
        List<Integer> list=new ArrayList<>();
        if(root==null){
            return list;
        }
        queue.offer(root);
        while(!queue.isEmpty()){
            int len=queue.size();
            int max=Integer.MIN_VALUE;
            while(len>0){
                TreeNode node=queue.poll();
                max=max>node.val?max:node.val;
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
                len--;
            }
            list.add(max);
        }
        return list;
    }
}

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

5.7.1问题

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

复制代码
struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

  • 示例一:
复制代码
输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

5.7.2解法:层序遍历

java 复制代码
class Solution {
    public Node connect(Node root) {
        Queue<Node> queue=new LinkedList<>();
        if(root==null){
            return root;
        } 
        queue.offer(root);
        while(!queue.isEmpty()){
            int len=queue.size();
            for(int i=0;i<len;i++){
                Node node=queue.poll();
                if(i==len-1){
                    //最后一个节点
                    node.next=null;
                }else{
                    //非最后一个节点
                   node.next=queue.peek();
                }

                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
            }
        }
        return root;
    }
}

5.8 116_填充每个节点的下一个右侧节点指针||

5.8.1问题

给定一个二叉树:

复制代码
struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

  • 示例一:
复制代码
输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

5.8.2解法:层序遍历

这道题目说是二叉树,但116题目说是完整二叉树,其实没有任何差别,一样的代码一样的逻辑

5.9 104_二叉树的最大深度

5.9.1问题

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

  • 示例一:
复制代码
输入:root = [3,9,20,null,null,15,7]
输出:3

5.9.2解法:层序遍历

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

            }
            max++;
        }
        return max;
    }
}

5.10 111_二叉树的最小深度

5.10.1问题

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

**说明:**叶子节点是指没有子节点的节点。

  • 示例一:
复制代码
输入:root = [3,9,20,null,null,15,7]
输出:2

5.10.2解决

java 复制代码
class Solution {
    public int minDepth(TreeNode root) {
        Queue<TreeNode> queue=new LinkedList<>();
        int max=0;
        if(root==null){
            return max;
        }
        queue.offer(root);
        while(!queue.isEmpty()){
            int len=queue.size();
            while(len>0){
                TreeNode node=queue.poll();
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
                //注意:若该节点的左右孩子均为空,则到达最低点
                if(node.left==null && node.right==null){
                    max++;  //算上该层
                    return max;
                }
                len--;
            }
            max++;
        }
        return max;
    }
}
相关推荐
王中阳Go15 小时前
从超市收银到航空调度:贪心算法如何破解生活中的最优决策谜题?
java·后端·算法
故事挺秃然16 小时前
中文分词:机械分词算法详解与实践总结
算法·nlp
车队老哥记录生活18 小时前
【MPC】模型预测控制笔记 (3):无约束输出反馈MPC
笔记·算法
地平线开发者19 小时前
BEV 感知算法评价指标简介
算法·自动驾驶
不过四级不改名67719 小时前
用c语言实现简易c语言扫雷游戏
c语言·算法·游戏
C++ 老炮儿的技术栈20 小时前
手动实现strcpy
c语言·开发语言·c++·算法·visual studio
倔强的石头_21 小时前
【数据结构与算法】利用堆结构高效解决TopK问题
后端·算法
倔强的石头_21 小时前
【数据结构与算法】详解二叉树下:实践篇————通过链式结构深入理解并实现二叉树
后端·算法
哎写bug的程序员21 小时前
leetcode复盘(1)
算法·leetcode·职场和发展
风靡晚21 小时前
用于汽车毫米波雷达的四维高分辨率点云图像
人工智能·算法·机器学习·计算机视觉·汽车·信息与通信·信号处理