Table of Contents
가장 긴 동일 값의 경로
난이도 | ★
리트코드 687
풀기전 풀어보면 좋은 문제
문제
Given the root of a binary tree, return the length of the longest path, where each node in the path has the same value. This path may or may not pass through the root.
The length of the path between two nodes is represented by the number of edges between them.
Input: root = [5,4,5,1,1,5]
Output: 2
Input: root = [1,4,5,4,4,5]
Output: 2
Constraints:
The number of nodes in the tree is in the range [0, 104].
-1000 <= Node.val <= 1000
The depth of the tree will not exceed 1000.
[전제]
# 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:
def longestUnivaluePath(self, root: TreeNode) -> int:
문제 풀기 전 알고 갈 개념
풀이과정
풀이의 전체 과정부터 살펴보자
1) 재귀 탐색으로 트리의 말단, 리프 노드까지 DFS로 탐색해 내려간다.
2) 값이 일치할 경우 거리를 차곡차곡 쌓아 올려가며 백트래킹하는 형태로 풀이
1) DFS 재귀 탐색
- 마지막 노드를 찾아내 0을 리턴
def dfs(node: TreeNode):
...
left = dfs(node.left)
right = dfs(node.right)
이렇게 재귀 호출로 내려가면 left , right 는 각각 리프 노드에 이르러서 값을 리턴받게 된다.
더 이상 존재하지 않는 노드까지 내려가게 되면 다음과 같은 형태로 값을 리턴.
if node is None:
return 0
즉 잎노드다 0이 되는 것이다.(존재하지 않은 노드까지 내려가면 0)
- 이제 이 값이 점점 백트래킹 되면서 증가할 것임
2) 자식 노드가 동일한 값인지 확인
왼쪽과 오른쪽 자식 노드를 각각 확인해서 현재 노드, 그러니까 부모 노드와 동일한 경우 각각 거리를 1 증가
if node.left and node.left.val == node.val:
left += 1
else:
left = 0
if node.right and node.right.val == node.val:
right += 1
else:
right = 0
[5] -> [4] -> [3] -> [2] -> [1] 순으로 탐방하자
- 그런데 [5],[3],[2] 는 마지막 노드임으로 이미
1) DFS 재귀 탐색
에 의해 0이다
그러므로, [4] , [1] 만 탐방하자!
3) 결과
이제 다음과 같이 왼쪽 자식과 오른쪽 자식 노드 간 거리의 합을 결과로 함
result = max(result, left + right)
전체
class Solution:
result: int = 0
def longestUnivaluePath(self, root: TreeNode) -> int:
def dfs(node: TreeNode):
if node is None:
return 0
# 존재하지 않는 노드까지 DFS 재귀 탐색
left = dfs(node.left)
right = dfs(node.right)
# 현재 노드가 자식 노드와 동일한 경우 거리 1 증가
if node.left and node.left.val == node.val:
left += 1
else:
left = 0
if node.right and node.right.val == node.val:
right += 1
else:
right = 0
# 왼쪽과 오른쪽 자식 노드 간 거리의 합 최댓값이 결과
self.result = max(self.result, left + right)
# 자식 노드 상태값 중 큰 값 리턴
return max(left, right)
dfs(root)
return self.result