[leetcode-遞迴]687. 最長同值路徑
阿新 • • 發佈:2019-01-26
給定一個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。 這條路徑可以經過也可以不經過根節點。
注意:兩個節點之間的路徑長度由它們之間的邊數表示。
示例 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; }