1. 程式人生 > >【LeetCode & 劍指offer刷題】樹題10:124. Binary Tree Maximum Path Sum

【LeetCode & 劍指offer刷題】樹題10:124. Binary Tree Maximum Path Sum

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

124. Binary Tree Maximum Path Sum

  Given a   non-empty   binary tree, find the maximum path sum. For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain
  at least one node   and does not need to go through the root. Example 1: Input: [1,2,3]    1 / \ 2 3   Output:
6 Example 2: Input: [-10,9,20,null,null,15,7]       -10    /   \   9      20         / \
       15  7   Output: 42
  /**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;  *     TreeNode *left;  *     TreeNode *right;  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}  * };  */ /* 問題:找二叉樹中和最大的路徑(起始位置和結束位置可以為任意位置) 有點類似42 連續子陣列的最大和(53. Maximum Subarray) */ class Solution { public :     int maxPathSum ( TreeNode * root )     {         int res = INT_MIN ;         helper ( root , res );  //用res變數儲存結果         return res ;     }          int helper ( TreeNode * node , int & res )     {         if (! node ) // 結點為空直接返回 0             return 0 ;                 // 計算左右子樹的最大路徑和         int left = max ( helper ( node -> left , res ), 0 ); // 如果選 0 ,表示不加該子樹(子樹和為負數)         int right = max ( helper ( node -> right , res ), 0 );                 // 更新全域性最大值         res = max ( res , left + right + node -> val ); // 該全域性最大值作為總結果最後輸出(通過遞迴遍歷,可以覆蓋到經過node的所有路徑,node也在變,故可以得到所有路徑)         // 返回結果         return max ( left , right ) + node -> val ; //遞迴函式 返回值的定義是以當前結點為終點的path 之和,所以只能取 left right 中較大的那個值,而不是兩個都要     } };