填充每个节点的下一个右侧节点指针 II(JS实现)
填充每个节点的下一个右侧节点指针 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;
};