文章目录
-
- [5.6 515_在每个树行中找最大值](#5.6 515_在每个树行中找最大值)
- [5.7 116_填充每个节点的下一个右侧节点指针](#5.7 116_填充每个节点的下一个右侧节点指针)
- [5.8 116_填充每个节点的下一个右侧节点指针||](#5.8 116_填充每个节点的下一个右侧节点指针||)
- [5.9 104_二叉树的最大深度](#5.9 104_二叉树的最大深度)
- [5.10 111_二叉树的最小深度](#5.10 111_二叉树的最小深度)
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;
}
}