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;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章