題目
給定一個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。 這條路徑可以經過也可以不經過根節點。
注意:兩個節點之間的路徑長度由它們之間的邊數表示。
示例 1:
輸入:
5
/ \
4 5
/ \ \
1 1 5
輸出: 2
示例 2:
輸入:
1
/ \
4 5
/ \ \
4 4 5
輸出: 2
注意: 給定的二叉樹不超過10000個結點。 樹的高度不超過1000。
解題思路
我們定義函數longestUnivalue返回左右兩邊其中最大的路徑長度,此時我們有四種情況考慮
root.left == root == root.right
root.left == root
root.right == root
root.left != root != root.right
對于第一種情況此時左右孩子和根相同,需要更新的最大長度res=max(res,l+r+2),并且返回max(l,r)+1
對于第二種情況,此時左孩子和根相同,需要更新最大長度res=max(res,l+1),并且返回l+1
對于第三種情況,此時右孩子和根相同,需要更新最大長度res=max(res,r+1),并且返回r+1。
對于第四種情況,此時只需返回0即可。
代碼實現
public int visitTreeLongestPath(Node node) {
if (node == null) {
return 0;
}
int left = visitTreeLongestPath(node.left);
int right = visitTreeLongestPath(node.right);
if (node.left != null && node.left.value == node.value &&
node.right != null && node.right.value == node.value) {
Math.max(currentMax, left + right + 2);
return Math.max(left, right) + 1;
}
if (node.left != null && node.left.value == node.value) {
int value = left + 1;
Math.max(currentMax, value);
return value;
}
if (node.right != null && node.right.value == node.value) {
int value = right + 1;
Math.max(currentMax, value);
return value;
}
return 0;
}
類似問題
- Leetcode 124:二叉樹中的最大路徑和(超詳細的解法!!!)
- Leetcode 543:二叉樹的直徑(超詳細的解法!!!)
參考: https://blog.csdn.net/qq_17550379/article/details/87380945