116. Populating Next Right Pointers in Each Node
완전 이진 트리에서 next 포인터에 동일 레벨의 인접한 다음 노드를 추가하는 문제이다.
node.left.next = node.right
node.right.next = node.next.left
null
트리의 구조 및 용어 설명은 👉 여기
Input: root = [1,2,3,4,5,6,7]
Output: [1,#,2,3,#,4,5,6,7,#]
next 포인터가 null일 경우 '#'로 나타낸 것
👉 output의 형태는 신경쓰지 않고, next 포인터를 채우는 함수를 완성한다.
핵심은 node의 left
를 탐색하는 leftEnd
와 next
를 연결하는 curr
이다. leftEnd
는 트리의 마지막 레벨에 도달할 때까지 각 레벨을 반복하고 curr
는 동일 레벨(자식)의 다음 노드를 next 포인터로 연결한다. 코드를 보는 편이 이해가 쉬울 것 같다.
// 코드 일부
let leftEnd = root;
while (leftEnd.left) {
// ... 중략 ...
leftEnd = leftEnd.left;
}
leftEnd
의 역할은 left 포인터가 있을 때까지 반복한다. 마치 이중 반복문에서 행을 탐색하는 것과 같다.
// 코드 일부
let curr = leftEnd;
while (curr) {
curr.left.next = curr.right;
if (curr.next) {
curr.right.next = curr.next.left;
}
curr = curr.next;
}
curr.left.next = curr.right
curr.right.next = curr.next.left
/**
* // 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) {
if (!root) return null;
let leftEnd = root
while(leftEnd.left) {
let curr = leftEnd;
while(curr) {
curr.left.next = curr.right;
if (curr.next) {
curr.right.next = curr.next.left;
}
curr = curr.next;
}
leftEnd = leftEnd.left;
}
return root
};