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;
};