# [117] 填充每个节点的下一个右侧节点指针 II

给定一个二叉树

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 指针连接),'#' 表示每层的末尾。

这道题需要我们将二叉树横向连接起来,那么需要我们横向地遍历节点,因此很容易想到使用BFS来进行遍历。

我们使用双指针不断地指向同一层级中的前后节点,将它们的next指针链接起来即可。

function connect(root: Node | null): Node | null {
  if (root === null) return null;

  const queue: Node[] = [];
  queue.unshift(root);

  while (queue.length > 0) {
    let prev: Node | null = null;
    // 将当前队列中,即当前层级中所有节点做分析。
    // 注意,由于queue.length可能会变化,这里一定要锁死当前队列的length
    let count = queue.length;
    while (count) {
      const curr = queue.pop();

      // 此时curr表示prev的右侧节点,当prev节点指向节点时,将next节点指向curr
      if (prev) {
        prev.next = curr;
      }
      // 之后根据BFS顺序, prev 指针向右移动
      prev = curr;

      // 之后将节点的下一层节点入队列
      if (curr.left) {
        queue.unshift(curr.left);
      }
      if (curr.right) {
        queue.unshift(curr.right);
      }
      count--;
    }
  }
  return root;
}