117. 填充每个节点的下一个右侧节点指针 II(JS实现)

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 所示。
提示:
树中的节点数小于 6000
-100 <= node.val <= 100

2 思路

这道题的主要思路在层序遍历每个节点时,逐步连接子节点

3代码

/**
 * // Definition for a Node.
 * function Node(val, left, right, next) {
 *    this.val = val === undefined ? null : val;
 *    this.left = left === undefined ? null : left;
 *    this.right = right === undefined ? null : right;
 *    this.next = next === undefined ? null : next;
 * };
 */

/**
 * @param {Node} root
 * @return {Node}
 */
var connect = function(root) {
  let p = root;
  let next = null;
  let leftMost;

  while (p) {
    while(p) {
      next = p.next;
      while (next && !next.left && !next.right) {   //寻找下一个具有子节点的兄弟节点
        next = next.next;
      }
      connect(p, next);   //连接相邻的两个兄弟节点
      p = next;
    }

    p = leftMost;   //跳转到下一层
    leftMost = null;
  }


  function connect(p, nextNode) {
    if (!p.left && !p.right)  return;    //如果当前节点无子节点,那么无需连接后续节点

    if (!leftMost) leftMost = p.left || p.right;   //记录当层最左端的节点

    if (p.left && p.right) {     //如果当前节点有两个子节点,先将两个子节点连接在一起
      p.left.next = p.right;
    }

    let linkNode = p.right || p.left;   //找到当前节点靠右的子节点

    if (nextNode) {    //将当前节点靠右的子节点和当前节点兄弟节点的子节点连接在一起
      linkNode.next = nextNode.left || nextNode.right;
    } else {
      linkNode.next = null;
    }
  }

  return root;
};

猜你喜欢

转载自blog.csdn.net/zjw_python/article/details/107029806
今日推荐