[DFS] Diameter of Binary Tree

개발새발log·2022년 3월 11일

처음에 입력값에 대한 문제 이해를 잘못 해서 한참을 헤맸다. 알고보니 링크드 리스트 형식으로 부모, 왼쪽 자식, 오른쪽 자식 형태의 노드가 입력이 되는거라고.. 저처럼 Array가 입력되는 걸로 이해해서 왼쪽 노드 = 부모노드*2, 오른쪽 노드 = 부모노드*2 + 1로 몇시간 삽질하지 마시길.. (없겠지만)

문제 접근하기

<문제>
Given the root of a binary tree, return the length of the diameter of the tree.

The diameter of a binary tree is the length of the longest path between any two nodes in a tree.
This path may or may not pass through the root.

The length of a path between two nodes is represented by the number of edges between them.
.
.
쉽게 말하면 노드와 노드 사이 가장 거리가 긴 경우를 찾으라는건데,
This path may or may not pass through the root.

이 파트가 상당히 중요한 힌트였던 거 같다.

난 처음에 가장 긴 diameter는 무조건 루트를 지날거라고 생각했는데, 생각해보니 이런 경우도 있다;

요점은, 각 노드를 root라고 봤을 때 그 노드를 기준으로 가장 긴 diameter를 찾아서 갱신하는 식으로 가야한다는 것이다.

즉, recursive하게 말단의 노드부터 현 노드 기점으로 가장 긴 경로를 계산해서 거슬러 올라가는 식으로 풀이가 진행될 것이다.

코드

class Solution:
	longest: int = 0
    
    def diameterOfBinaryTree(self, root):
    	def dfs(node):
        	if not node:
            	return -1
            left = dfs(node.left)
            right = dfs(node.right)
            self.longest = max(self.longest, left + right + 2)
            
            return max(left, right) + 1 
    
    dfs(root)
    return self.longest

처음엔 코드 보고 이게.. 뭔..??? 왜 2를 더하고 1을 더하고..? 했는데 차근차근 뜯어보니까

self.longest = max(self.longest, left + right + 2)

최종 리턴해야 하는 건 가장 긴 diameter라는 걸 잊지 말자. longest는 이 diameter를 뜻한다.

그러기 위해서 말단 노드에서부터 현 노드 기점으로 가장 긴 diameter가 뭔지 갱신하는 과정이다.
left + right + 2 는 현재 노드 기점 left node까지의 거리 + right node까지의 거리 + edge 2개를 의미한다.
dfs에서 return 하는 건 해당 노드까지의 최장 거리이다.

해당 노드까지의 최장 거리?

return max(left, right) + 1 

leaf 노드 기점으로 현재 노드까지의 거리를 말한다. 왼쪽, 오른쪽 중 더 긴 길이 + edge 1개다.

leaf 노드는 아마 0을 return 할 것이다. 노드가 없는 경우에는 -1을 return하기 때문에 max(-1, -1)+1이 되므로. 한번씩 그려보면서 과정을 따라가는 걸 추천한다!

참고

https://ihp001.tistory.com/102

profile
⚠️ 주인장의 머릿속을 닮아 두서 없음 주의 ⚠️

1개의 댓글

블로그 참고해주셔서 감사합니당~

답글 달기