2024년 5월 17일 (금)
Leetcode daily problem
https://leetcode.com/problems/delete-leaves-with-a-given-value/
이진 트리 루트와 목표값 정수가 주어지면 목표 값을 가진 모든 리프 노드를 삭제한다.
값이 target인 리프 노드를 삭제한 후 해당 상위 노드가 리프 노드가 되고 값이 target인 경우 삭제되어야 한다는 점을 유의해야 한다(할 수 없을 때까지 계속해서 삭제해야 함)
dfs
dfs를 이용한 재귀 호출로 이진 트리에서 주어진 값을 가진 모든 리프 노드를 삭제한다.
후위 순회를 해가면서 자식 노드부터 처리한 후 부모 노드를 처리하는 후위 순회를 사용하면, 리프 노드를 제거한 후 부모 노드를 갱신할 수 있다.
root가 None이면 None을 반환하고, 서브 트리로 root의 왼쪽과 오른쪽 자식을 대상으로 재귀적으로 removeLeafNodes 함수를 호출한다.
그리고 현재 노드가 리프 노드인지 확인하고, 리프 노드이며 값이 target인 경우 None을 반환하고, 리프 노드가 아닌 경우 현재 노드를 그대로 반환하는 식으로 이진 트리를 업데이트 한다.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def removeLeafNodes(self, root: Optional[TreeNode], target: int) -> Optional[TreeNode]:
if not root:
return None
root.left = self.removeLeafNodes(root.left, target)
root.right = self.removeLeafNodes(root.right, target)
if not root.left and not root.right and root.val==target:
return None
return root
시간 복잡도
트리의 모든 노드를 한 번씩 방문하므로 시간 복잡도는 O(n) 이다.
n: 트리의 노드 수
공간 복잡도
재귀 호출을 통해 트리를 탐색하므로 재귀 호출 스택이 공간을 차지한다. 재귀 호출의 깊이는 트리의 높이에 비례하므로, 트리의 최대 높이를 H라고 했을 때 공간복잡도는 O(H)이다.
여기서 이진 트리가 한쪽으로 치우치면 O(H), 균형 이진트리이면 O(log H) 이다. 최악의 경우 O(H)이다.