Longest Univalue Path - LeetCode
2022-02022
이진트리의 루트가 주어졌을 때, 가장 긴 path의 길이를 리턴하다. 이 때 path의 각 노드들은 모두 같은 값을 갖는 것들이어야 한다. (path는 root를 지날 수도, 지나지 않을 수도 있다 )
(:30)
이 문제를 풀 때면, parent - child의 값이 같은 경우와 다른 경우를 먼저 나눠보게 된다.
또한, 먼저 leaf node에 도달할 때 까지 탐색을 하여, parent로 값을 리턴하는 식으로 문제를 푸는 방식을 생각할 수 있다.
이 때 주의할 것이 있는데
max 를 update 하는 값과, 상위로 리턴하는 값을 다르게 해야한다 ( 내 풀이식으로는)
- 상위노드로 리턴하는 값 : 현재노드의 left subtree, right subtree에서의 longest univalue path 값
- 현재 노드에서 max를 update 할 때 값은 : 현재 노드를 루트로 하는 서브트리에서의 longest univalue path 값.
- 즉, 상위노드로 리턴하는 값과 max 업데이트 값이 다르다는 것에 주의해야한다.
class Solution {
public int max = 0 ;
public int longestUnivaluePath(TreeNode root) {
if(root == null) return 0;
dfs(root,root.val);
return max;
}
public int dfs(TreeNode cur, int pv){
if(cur == null) return 0;
int left = dfs(cur.left,cur.val);
int right = dfs(cur.right,cur.val);
// update max
max = Math.max(max,left+right);
// return
if(cur.val == pv) return Math.max(left,right)+1;
else return 0;
}
}
이진트리의 root가 주어졌을 때, “같은 값을 가진 노드로만 이루어진 가장 긴 경로” 의 길이를 리턴하라
(0:60)
책에는 별이 한개던데.. 한개짜리 문제가 맞는가 모르겠다
문제를 푸는데 몇 번 틀렸었음
- 그 이유는 dfs를 두번씩 하고 있었다 → 그에 따라 값이 바뀌어버렸었다. 이런.. 바보같다. 주의해야할 듯 💥
두 노드 사이의 길이
path라는 것은 연속된 노드여야한다. 그리고 이 문제는 같은 값을 가진 노드들이어야 한다. 따라서, 하위노드가, 상위노드와 값이 다른 경우에는 그 연결이 끊어진 것이다
상위노드와의 값이 같은 경우에만, depth를 리턴해줘야한다
트리의 직경 문제에서도 혼란이 조금 있었던 부분인데 여기서도 똑같은 행동을 하고 있었음.
class Solution {
public int max = 0;
public int longestUnivaluePath(TreeNode root) {
// 시작 val은 Node.val 범위에 없는 값을 주도록 한다. -> 그래야, root도 path의 루트인 경우에 대해서도 해 볼 수 있음
dfs(root,1001);
return max;
}
// 계속 틀렸던 이유 -> dfs를 두번씩 하고 잇었음 -> 그에 따라 값이 바뀌어버림...
// 현재노드 cur, 상위노드의 값 val
public int dfs(TreeNode cur, int val){
if(cur == null) return 0;
int left = dfs(cur.left,cur.val);
int right = dfs(cur.right,cur.val);
// max 를 update하고 ( 항상 현재 노드가 해당 경로의root노드(?) 가 될 가능성이 있기 때문임. )
max = Math.max(max,left+right);
if(cur.val!=val){
// cur을 루트로 하는 path tree를 찾는다.
// 상위노드로 리턴하는 값은 0이어야함 ( 동일값이 아니었으니)
return 0;
}else{
// 부모에게는 depth값을 리턴
return Math.max(left,right)+1;
}
}
}