【JS每日一算法】🟨110.填充每个节点的下一个右侧节点指针(广度优先)

192 阅读1分钟

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

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

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

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

提示:

  • 树中节点的数量在 [0, 212 - 1] 范围内
  • -1000 <= node.val <= 1000

示例 1:

image.png

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

示例 2:

输入: root = []
输出: []

题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @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
}