【算法刷题 | 二叉树 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;
    }
}
相关推荐
ywwwwwwv8 分钟前
力扣139
算法·leetcode·职场和发展
smj2302_7968265220 分钟前
解决leetcode第3777题使子字符串变交替的最少删除次数
python·算法·leetcode
Tisfy30 分钟前
LeetCode 2110.股票平滑下跌阶段的数目:数学(一次遍历)
数学·算法·leetcode·题解
1024小神31 分钟前
swift中 列表、字典、集合、元祖 常用的方法
数据结构·算法·swift
ULTRA??33 分钟前
Informed RRT*实现椭圆启发式采样
c++·算法
Swizard34 分钟前
告别样本不平衡噩梦:Focal Loss 让你的模型学会“划重点”
算法·ai·训练
亭台1 小时前
【Matlab笔记_23】MATLAB的工具包m_map的m_image和m_pcolor区别
笔记·算法·matlab
李玮豪Jimmy1 小时前
Day39:动态规划part12(115.不同的子序列、583.两个字符串的删除操作、72.编辑距离)
算法·动态规划
历程里程碑1 小时前
C++ 10 模板进阶:参数特化与分离编译解析
c语言·开发语言·数据结构·c++·算法
星辞树2 小时前
从 In-context Learning 到 RLHF:大语言模型的范式跃迁
算法