[LeetCode] 687. Longest Univalue Path
題:https://leetcode.com/problems/longest-univalue-path/description/
題目
Given a binary tree, find 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.
Note: The length of path between two nodes is represented by the number of edges between them.
Example 1:
Input:
5
/ \
4 5
/ \ \
1 1 5
Output:
2
Example 2:
Input:
1
/ \
4 5
/ \ \
4 4 5
Output:
2
Note: The given binary tree has not more than 10000 nodes. The height of the tree is not more than 1000.
題目大意
相同結點值路徑的最大長度
思路
相同結點值路徑的最大長度res = 左子樹中 結點都在不同層的 相等路 的結點數 + 右子樹中 結點都在不同層的相等路 的結點數 + 1 - 1 。
最後減1是因為 邊的數 == 結點數 - 1。
問題轉化為:
求 結點作為root, 結點都在不同層相等路 的 結點數。
dfs 遞迴方法
int dfs(TreeNode) 遞迴函式狀態:返回 左右子樹中 較長 結點都在不同層的相等路 的長度(結點數)。
狀態轉移方程:
1.dfs(root) = max(dfs(root.left),dfs(root.right)) +1(若當前結點的val 與 子樹結點的相同)
2.dfs(root) = dfs(root.left) + 1 (若只有 左子樹 存在且相同)
3.dfs(root) = 1 (若都子樹都不存在 或 子樹結點val與root不同)
終止條件:if root == null,return 0;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int res = 0;
public int dfs(TreeNode root){
if(root == null)
return 0;
int lPathLenth = dfs(root.left);
int rPathLenth = dfs(root.right);
if(!(root.left!=null && root.left.val == root.val))
lPathLenth = 0;
if(!(root.right!=null && root.right.val == root.val))
rPathLenth = 0;
res = Math.max(res,lPathLenth + rPathLenth);
return Math.max(lPathLenth,rPathLenth) + 1;
}
public int longestUnivaluePath(TreeNode root) {
dfs(root);
return res;
}
}