每天一道LeetCode-----计算二叉树的最大路径和,路径只需要从一个节点到达另一个节点,无其他要求
Binary Tree Maximum Path Sum
原題鏈接Binary Tree Maximum Path Sum
給定一個二叉樹,計算二叉樹中最長的路徑和,路徑只需要從一個節(jié)點到另一個節(jié)點,不需要經(jīng)過根節(jié)點,也不需要從葉子節(jié)點開始,但至少包含一個節(jié)點
乍一看,二叉樹上任意一條路徑都有可能是最后的結(jié)果,而解決二叉樹又必須使用遞歸,如果在遞歸的過程中計算以當前節(jié)點為根節(jié)點的子樹的最長路徑和,同時要求必須經(jīng)過當前節(jié)點,那么在遞歸的過程中就可以將所有可能都遍歷到
但是在遞歸向上返回時不能返回上述過程計算的路徑和,因為返回的過程意為著路徑還需要向上延伸,那么到達當前節(jié)點向上延伸,就不可能將左右兩邊都計算到。所以在向上返回時需要返回一條經(jīng)過當前節(jié)點但是只在一側(cè)的路徑長
代碼如下
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:int maxPathSum(TreeNode* root) {int maxSum = INT_MIN;maxPathSum(root, maxSum);return maxSum;} private:/* 函數(shù)計算必須經(jīng)過root的路徑長,更新maxSum* 返回必須經(jīng)過root,但是只包含一側(cè)的路徑長 */int maxPathSum(TreeNode* root, int& maxSum){if(!root) return 0;/* 計算左右子樹的路徑長 */int leftSum = maxPathSum(root->left, maxSum);int rightSum = maxPathSum(root->right, maxSum);/* 必須經(jīng)過root */int sum = root->val;/* 大于0才需要加 */sum += (leftSum > 0) ? leftSum : 0;sum += (rightSum > 0) ? rightSum : 0;/* 更新maxSum,maxSum中保存遍歷到的路徑和的最大值 */maxSum = std::max(maxSum, sum);/* 只能返回一側(cè),當然減去小的那邊 */if(leftSum > 0 && rightSum > 0)return sum - std::min(leftSum, rightSum);elsereturn sum;} };本題還是利用遞歸,不過解決思路不太容易理解,需要弄清楚如何遍歷所有的路徑,因為路徑必須有節(jié)點,所以可以計算必須經(jīng)過根節(jié)點的路徑和求最大值,需要注意的是遞歸向上返回時不可以直接返回路徑和,因為向上返回意為著路徑向上延伸,那必須最多只能經(jīng)過當前節(jié)點的左右子樹中的一個,所以需要減去較小的子樹
總結(jié)
以上是生活随笔為你收集整理的每天一道LeetCode-----计算二叉树的最大路径和,路径只需要从一个节点到达另一个节点,无其他要求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----有效回
- 下一篇: 每天一道LeetCode-----计算最