[2024] day 108. Leetcode 623. Add One Row to Tree

gunny·2024년 4월 18일

2024년부터 새롭게 다시 시작하는 코딩테스트

2024년 4월 16일 (화)
Leetcode daily problem

623. Add One Row to Tree

https://leetcode.com/problems/add-one-row-to-tree/?envType=daily-question&envId=2024-04-16

Problem

이진 트리와 두 개의 정수 val, depth가 주어지면 주어진 depth에 해당하는 이진 트리의 depth에 값이 val인 노드 행을 추가한다.
여기서 root 노드의 depth는 1이다.

추가 규칙은 다음과 같다.

  • 정수인 depth가 주어지면 이진트리의 depth-1의 null이 아닌 각 트리 노드 cur에 대해 값 val을 cur의 왼쪽 하위 트리 루트와 오른쪽 하위 트리 루트로 사용하여 두 개의 트리 노드를 만든다.
  • cur의 원래 왼쪽 하위 트리는 새로운 왼쪽 하위 트리 루트의 왼쪽 하위 트리여야 합니다.
  • cur의 원래 오른쪽 하위 트리는 새로운 오른쪽 하위 트리 루트의 오른쪽 하위 트리여야 합니다.
  • 깊이 == 1이면 깊이가 없음을 의미하고 즉, 전체 원래 트리의 새 루트로 val 값을 사용하여 트리 노드를 만들고 원래 트리는 새 루트의 왼쪽 하위 트리입니다.

Solution

DFS(Depth-First Search, 깊이 우선 탐색)

해당 문제는 주어진 이진 트리에 대해 특정 깊이(depth)에 새로운 노드를 추가하는 문제이다.
깊이 우선 탐색(DFS, Depth-First Search)을 통해서 트리의 각 노드를 방문하면서 목표 깊이에 도달하면 새로운 노드를 추가하고, 기존의 자식 노드를 새로운 노드의 자식으로 이동시킨다.

엣지 포인트는 주어진 depth가 1일 경우 깊이가 없음을 의미하므로 원래 트리의 새 루트로 val 값을 사용해 트리 노드를 만드는 것이다.

주어진 이진 트리를 탐색해 나갈 때 해당 트리의 깊이가 주어진 depth와 같아질 경우에는 val을 이용해 TreeNode를 만들고, 좌,우에 생성한 트리노드(new_left, new_right)를 넣은 후에 트리노드의 new_left, new_right node에 현재 루트의 left, right를 넣어준다는 것이다. 그 후에 현재 루트의 left, right를 new_left, new_right로 교체해준다.

Code

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def addOneRow(self, root: Optional[TreeNode], val: int, depth: int) -> Optional[TreeNode]:

        if depth == 1:
            new_tree = TreeNode(val)
            new_tree.left = root
            return new_tree
        
        def dfs(node, d):
            if not node:
                return
            
            if d==depth-1:
                left_child, right_child = TreeNode(val), TreeNode(val)
                left_child.left, right_child.right = node.left, node.right
                node.left, node.right = left_child.left, right_child.right
                
            else:
                dfs(node.left, d+1)
                dfs(node.right, d+1)

        dfs(root, 1)

        return root

Complexicity

시간 복잡도

현재 주어진 깊이 만큼 트리를 탐색하지만 마지막 깊이에서 추가가 진행 될 수 있으므로 시간 복잡도는 O(n)이다.

공간 복잡도

dfs를 이용해 재귀적인 방식으로 코드가 진행되므로 트리의 높이만큼 공간 복잡도를 가진다. 공간 복잡도는 O(n)이다.

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글