387,二叉樹中的最大路徑和
想了解更多資料結構以及演算法題,可以關注微信公眾號“資料結構和演算法”,每天一題為你精彩解答。也可以掃描下面的二維碼關注
給定一個非空二叉樹,返回其最大路徑和。
路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
示例 1:
示例 2:
問題分析
這道題要求的最大路徑和如果是從根節點開始到葉子節點就好辦了,我們可以通過遞迴的方式,從下往上,捨去比較小的路徑節點,保留比較大的節點。
但這道題要求的最大路徑和並不一定經過根節點,如果再使用上面的方式就行不通了,對於這道題我們可以分為4種情況來討論
1,只要當前節點,捨棄子節點。比如下面結點2的左右子節點都是負數,如果是負數我們還不如不要,所以直接捨棄子節點。
2,保留當前節點和左子節點。比如下面結點2的右子節點是負數,我們直接捨棄右子節點,但左子節點不是負數,我們可以保留左子節點。
3,保留當前節點和右子節點。比如下面結點2的左子節點是負數,我們直接捨棄左子節點,但右子節點不是負數,我們可以保留右子節點。
4,保留當前節點和兩個子節點。比如下面結點2的左右子節點都不是負數,我們都可以留下。
上面的1,2,3都可以作為子樹的一部分再繼續計算,我們可以使用同一個公式,取左右子節點最大的那個即可,如果都小於0我們不要了,下面公式中left是左子樹的值,right是右子樹的值
而4是不能在作為子樹的一部分參與計算的,因為已經分叉了,比如下面的3→2→4是不能再和結點1進行組合的。第4種情況如果左右子樹有一個是小於0的我們還不如不選,如果都大於0我們都要選的。
搞懂了上面的分析過程,程式碼就很容易寫出來了,我們最後來看下程式碼
程式碼部分
private int maxValue = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
maxPathSumHelper(root);
return maxValue;
}
public int maxPathSumHelper(TreeNode root) {
if (root == null)
return 0;
//左子節點的值
int left = maxPathSumHelper(root.left);
//右子節點的值
int right = maxPathSumHelper(root.right);
//第4種情況
int cur = root.val + Math.max(0, left) + Math.max(0, right);
//第1,2,3三種情況,返回當前值加上左右子節點的最大值即可,如果左右子節點都
//小於0,還不如不選
int res = root.val + Math.max(0, Math.max(left, right));
//記錄最大value值
maxValue = Math.max(maxValue, Math.max(cur, res));
//第1,2,3種情況還可以再計算,所以返回的是res
return res;
}
相關文章
- 124. 二叉樹中的最大路徑和二叉樹
- [Python手撕]二叉樹中的最大路徑和Python二叉樹
- LeetCode 124. 二叉樹中的最大路徑和 | PythonLeetCode二叉樹Python
- 每日一道演算法題--leetcode 124--二叉樹中的最大路徑和--python演算法LeetCode二叉樹Python
- 二叉樹路徑總和二叉樹
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- 【LeetCode擊敗99%+】二叉樹路徑總和LeetCode二叉樹
- 霍夫曼樹(最優二叉樹)的實現二叉樹
- 二叉樹路徑查詢二叉樹
- 【模板題】 543. 二叉樹的直徑二叉樹
- 平衡樹和二叉樹的區別二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 樹和二叉樹簡介二叉樹
- LeetCode第 543 題:二叉樹的直徑(C++)LeetCode二叉樹C++
- 樹7 堆中的路徑
- 最優二叉樹(哈夫曼樹)Java實現二叉樹Java
- 相同二叉樹和鏡面二叉樹問題二叉樹
- leetcode 每日一題 543 二叉樹的直徑 dfs方法LeetCode每日一題二叉樹
- 到達二叉樹目標節點的完整路徑二叉樹
- 二叉樹任意兩個節點間的最大距離(Java,LeetCode 543二叉樹的直徑 遞迴)二叉樹JavaLeetCode遞迴
- 引數為二叉樹和一個整數,求所有和為該整數的路徑二叉樹
- day 15|二叉樹part03|110.平衡二叉樹|257. 二叉樹的所有路徑|404.左葉子之和| 222.完全二叉樹的節點個數二叉樹
- 中序線索二叉樹的構造和遍歷二叉樹
- 牛客題霸 [二叉樹中是否存在節點和為指定值的路徑] C++題解/答案二叉樹C++
- JZ-024-二叉樹中和為某一值的路徑二叉樹
- Python演算法和資料結構:在二叉樹中找到和為sum的所有路徑Python演算法資料結構二叉樹
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序
- 【vue】在二叉樹中根據子節點找出父節點路徑Vue二叉樹
- 平衡二叉樹(AVL樹)和 二叉排序樹轉化為平衡二叉樹 及C語言實現二叉樹排序C語言
- 二叉樹的最大深度和最小深度二叉樹
- 面試題34:二叉樹中和為某一值的路徑面試題二叉樹
- 二叉查詢樹和笛卡爾樹
- 樹的直徑
- 二叉樹中序和後序遍歷表示式二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 二叉樹和森林轉換二叉樹