给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
提示:
- 树中节点的数量在
[0, 212 - 1]范围内 -1000 <= node.val <= 1000
示例 1:
输入: root = [1,2,3,4,5,6,7]
输出: [1,#,2,3,#,4,5,6,7,#]
解释: 给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。
示例 2:
输入: root = []
输出: []
题解:
/**
* @description: 广度优先 TC:O(n) SC:O(n)
* @author: JunLiangWang
* @param {*} root 给定树的根节点
* @return {*}
*/
function bfs(root){
/**
*
* 该方案使用广度优先算法, 该题本质上还是树的层级遍历
* 我们只需要在广度优先算法的基础上,将出队的节点的next
* 指向当前队列中的首节点(因为出队节点的下一个节点即是它
* 右边的节点),如果队列中无节点,则不做任何处理
*
* 广度优先算法依靠一个队列,先将根节点入队,然后循环
* 不断将队列中的节点出队,然后将出队节点不为空的左右
* 节点再次入队。如此往复直到队列为空
*/
// 如果根为空,直接返回
if(!root)return root;
// 定义队列,将根节点入队
let quene=[root]
// 当队列不为空则继续遍历
while(quene.length>0){
// 记录当前队列长度,也是本次层级的
// 所有节点数量,由于出队会动态影响
// 到队列的长度,因此此处记录,就可
// 以知道本次层级的节点是否全部出队
let size=quene.length;
// 遍历当前层级的所有节点
while(size-->0){
// 出队
let node=quene.shift();
// 如果当前队列不为空证明有右节点
// 则将其next指向右节点
if(size>0)node.next=quene[0];
// 将出队节点不为空的左右节点再次入队
if(node.left)quene.push(node.left);
if(node.right)quene.push(node.right);
}
}
// 返回结果
return root
}