提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
3月6日练习内容
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目-填充每个节点的下一个右侧节点指针
1.题目描述
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例 1:
输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。
示例 2:
输入:root = []
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.思路与代码
2.1 思路
1.本题可以使用BFS搜索的方法进行从上到下,从左到右的遍历二叉树
2.创建队列,将每层结点放入队列
3.获取前一个结点,接着遍历每层二叉树,当前一个结点不为空的时候,将前一个结点的next指向当前结点
4.更新前一个结点,并把当前结点的左子树与右子树放入队列
5.输出
2.2 代码
代码如下(示例):
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node next;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, Node _left, Node _right, Node _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public Node connect(Node root) {
//判断输入是否为空
if(root == null){
return null;
}
//队列存储元素
Queue<Node> que = new LinkedList<>();
//将根结点加入队列
que.add(root);
while(!que.isEmpty()){
//前一个结点
Node pre = null;
//获取每层的元素个数
int size = que.size();
for(int i = 0;i < size;i ++){
//获取当前i处结点
Node curr = que.poll();
if(pre != null){
//前一个结点的next指向当前结点
pre.next = curr;
}
//更新pre的值
pre = curr;
if(curr.left != null){
que.add(curr.left);
}
if(curr.right != null){
que.add(curr.right);
}
}
}
return root;
}
}
总结
提示:这里对文章进行总结: