이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다.
문제 정의
로그 재정렬 기준
책에서 구현된 코드
# 1. 재귀
class Solution:
def rangeSumBST(self, root: TreeNode, L: int, R: int) -> int:
def dfs(node: TreeNode):
if not node:
return 0
if node.val < L:
return dfs(node.right)
elif node.val > R:
return dfs(node.left)
return node.val + dfs(node.left) + dfs(node.right)
return dfs(root)
# 2. stack (DFS)
class Solution:
def rangeSumBST(self, root: TreeNode, L: int, R: int) -> int:
stack, sum = [root], 0
# 스택 이용 필요한 노드 DFS 반복
while stack:
node = stack.pop()
if node:
if node.val > L:
stack.append(node.left)
if node.val < R:
stack.append(node.right)
if L <= node.val <= R:
sum += node.val
return sum
# 3. queue (BFS)
class Solution:
def rangeSumBST(self, root: TreeNode, L: int, R: int) -> int:
stack, sum = [root], 0
# 큐 연산을 이용해 반복 구조 BFS로 필요한 노드 탐색
while stack:
node = stack.pop(0)
if node:
if node.val > L:
stack.append(node.left)
if node.val < R:
stack.append(node.right)
if L <= node.val <= R:
sum += node.val
return sum
기억해야할 기법
- Stack / Queue를 이용한 반복구조
- 재귀만 사용하는 버릇이 생긴듯
- Stack / Queue를 이용한 구조도 익혀두자
내가 구현한 코드
class Solution:
def rangeSumBST(self, root: TreeNode, low: int, high: int) -> int:
if root:
if root.val > high:
sum = self.rangeSumBST(root.left, low, high)
elif root.val < low:
sum = self.rangeSumBST(root.right, low, high)
else:
sum = self.rangeSumBST(root.left, low, high) + self.rangeSumBST(root.right, low, high) + root.val
return sum
return 0
- 재귀보다 stack/queue를 사용한 구조가 일반적으로 더 빠르다고 함
- stack/queue를 더 활용하자
'책읽기' 카테고리의 다른 글
[파이썬 알고리즘 인터뷰][트리] 전위,중위 순회 결과로 이진 트리 구축 (0) | 2021.08.04 |
---|---|
[파이썬 알고리즘 인터뷰][BST] 이진 탐색 트리 노드 간 최소 거리 (0) | 2021.08.04 |
[파이썬 알고리즘 인터뷰][BST] 이진 탐색 트리를 더 큰 수 합게 트리로 (0) | 2021.08.04 |
[파이썬 알고리즘 인터뷰][BST] 정렬된 배열의 이진 탐색 트리 변환 (0) | 2021.08.04 |
[Java의 정석][Chapter-3] 연산자 (0) | 2021.08.04 |