1. 程式人生 > >[LeetCode] 687. Longest Univalue Path

[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;
    }
}