[算法練習] Leetcode 687 最長同值路徑

題目

給定一個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。 這條路徑可以經過也可以不經過根節點。
注意:兩個節點之間的路徑長度由它們之間的邊數表示。
示例 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。