1. 程式人生 > >[leetcode-遞迴]687. 最長同值路徑

[leetcode-遞迴]687. 最長同值路徑

給定一個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。 這條路徑可以經過也可以不經過根節點。

注意:兩個節點之間的路徑長度由它們之間的邊數表示。

示例 1:

輸入:

              5
             / \
            4   5
           / \   \
          1   1   5

輸出:

2

示例 2:

輸入:

              1
             / \
            4   5
           / \   \
          4   4   5

輸出:

2

注意: 給定的二叉樹不超過10000個結點。 樹的高度不超過1000。

//=====================================================================

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int dfs(struct TreeNode *root, int *up)
{
    //計算左子樹的長度,如果沒有左子樹,則長度為0
    int l = root->left ? dfs(root->left, up): 0;
    
    //計算右子樹的長度,如果沒有右子樹,則長度為0
    int r = root->right ? dfs(root->right, up):0;
    
    //如果左子樹和根結點數值相同,則該結點為根的數長度加1,否則為0,因為不符合等值連續條件
    int resl = root->left && root->left->val==root->val ? l+1:0;
    
    //如果右子樹和根結點數值相同,則該結點為根的數長度加1,否則為0,因為不符合等值連續條件
    int resr = root->right && root->right->val==root->val ? r+1:0;
    
    //該結點為根的總長度與儲存的最大值比較,如果超過最大長度,則更新最大長度
    if(resl+resr > *up)
    {
        *up = resl+resr;
    }
    
    //返回以該結點為根符合條件的長度
    return (resl>resr?resl:resr);
}
int longestUnivaluePath(struct TreeNode* root) {
    if(root==NULL)
    {
        return 0;
    }
    
    int up=0;
    
    //求等值的最大長度
    dfs(root, &up);
    
    return up;
}