관리 메뉴

FU11M00N

[LeetCode] Binary Tree Right Side View - Javascript 본문

알고리즘

[LeetCode] Binary Tree Right Side View - Javascript

호IT 2023. 9. 8. 01:48

Binary Tree Right Side View

[오른쪽 시야에서 트리 보기]

 

제약 조건 

The number of nodes in the tree is in the range [0, 100].
-100 <= Node.val <= 100

Example

ex2) Input: root = [1,null,3]
     Output: [1,3]

ex3) Input: root = []
     Output: []

초기 문제 접근 방식

초기엔 문제 설명에 대해 이해가 잘 안가, 예시의 그림을 보고 대충 이해하고 풀었다.
단순히 오른쪽 노드를 모두 출력하는 줄 알고 아래와 같이 문제를 풀었고, 실제로 처음 주어지는 테스트케이스 3개는 풀었지만,
다른 테스트 케이스들은 풀지 못했다.

초기 접근 코드

var rightSideView = function(root) {
    const result = [];
    const queue = [];
    
    if (root === null) return result;
    
    queue.push(root);
    while(queue.length !== 0) {
        let size = queue.length;
        for (let i = 0; i < size; i++) {
            let n = queue.shift();
            if (i === size - 1) result.push(n.val);
            if (n.left !== null) queue.push(n.left);
            if (n.right !== null) queue.push(n.right);
        }
    }
    
    return result;
};

다시 생각 해보며

실패한 테스트케이스들을 보며 문제를 다시 이해 할 수 있었다.

위의 그림을 예시로, 만약 1,3,4 중 4가 없다고 가정 해보자.

그럼 리턴해야 할 값은 1,3,5가 된다. 4가 없어짐과 동시에 5가 보여지는것이다.

만약 1,3,4 중 3이 사라지면 1,4,5가 보여야한다. 4의 노드가 3의 자리에 들어가기에 5노드가 보이기 때문이다.

 

문제를 풀이하는데에 접근한 방법은 아래와 같다.

먼저 트리의 왼쪽에 있는 노드를 배열에 넣는다.

이 과정을 반복하며 트리의 왼쪽 끝에 도달 한 다음 값이 없으면 오른쪽 노드의 값으로 덮어 씌운다.

 

맨 왼쪽 노드를 모두 재귀 호출했을 땐
res 배열에 [1,2,5]가 들어가게 되고, 해당 노드가 존재하지 않을 때까지 순회했을 때,
오른쪽 노드를 재귀 호출해서 right 값으로 덮어씌우고 없으면 해당 값 그대로 존재하게 한다.
여기서 배열 3개의 인덱스는 각각의 레벨 0, 1, 2로 해석된다.
즉 현재 트리는 3,4가 존재하기에 기존에 존재하던 2,5는 3,4,로 덮어 쓰기가 되어 [1,3,4]가 된다.

solve 코드

function rightSideView(root) {    
    const res = []
    
    function traverse(node, level) {
        if (node?.val === undefined){
            return null
        } 

        res[level] = node.val
        
        traverse(node.left, level + 1)
        traverse(node.right, level + 1)
    }
    
    traverse(root, 0)
    
    return res
};
Comments