알고리즘/트리

이진 탐색 트리(BST) 합의 범위

jwjwvison 2022. 5. 8. 19:57

 

https://leetcode.com/problems/range-sum-of-bst/

 

Range Sum of BST - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

 1. 재귀 구조 DFS로 브루트 포스 탐색

 

 DFS로 전체를 탐색한 다음, 노드의 값이 low와 high 사이일 때만 값을 부여하고, 아닐 경우에는 0을 취해 계속 더해 나가면 쉽게 구할 수 있다.

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    sum=0
    def rangeSumBST(self, root: Optional[TreeNode], low: int, high: int) -> int:
        
        if not root:
            return 0
        
        return (root.val if low<= root.val <=high else 0) + self.rangeSumBST(root.left,low,high) + self.rangeSumBST(root.right,low,high)

 그러나 이 방식은 모든 노드를 탐색하는 브루트 포스 풀이이다. 좀 더 최적화를 해보자.

 

 2. DFS 가지치기로 필요한 노드 탐색

 DFS로 탐색 하되 low,high 조건에 해당되지 않는 가지를 쳐내는 형태로 탐색에서 배제하도록 다음과 같이 구현해보자.

class Solution:
    sum=0
    def rangeSumBST(self, root: Optional[TreeNode], low: int, high: int) -> int:
        
        def dfs(node):
            if not node:
                return 0
            if node.val < low:
                return dfs(node.right)
            elif node.val>high:
                return dfs(node.left)
            return node.val + dfs(node.left) + dfs(node.right)
        
        return dfs(root)

 아래는 내가 새로 짠 코드이다.

class Solution:
    sum=0
    def rangeSumBST(self, root: Optional[TreeNode], low: int, high: int) -> int:
        
        if root:
            if root.val>=low and root.val<=high:
                self.sum+=root.val
                self.rangeSumBST(root.left,low,high)
                self.rangeSumBST(root.right,low,high)

            elif root.val <low:
                self.rangeSumBST(root.right,low,high)

            elif root.val >high:
                self.rangeSumBST(root.left,low,high)


        return self.sum

 이 경우 불필요한 탐색은 배제하게 되므로 탐색 효율이 매우 높다. 필요한 노드만 탐색하여 해당 노드의 값들을 더해 나가게 된다.

'알고리즘 > 트리' 카테고리의 다른 글

트리 순회  (0) 2022.05.10
이진 탐색 트리(BST) 노드 간 최소 거리  (0) 2022.05.09
정렬된 배열의 이진 탐색 트리 변환  (0) 2022.05.08
이진 탐색 트리  (0) 2022.05.08
최소 높이 트리  (0) 2022.05.04