小明思考

          Just a software engineer
          posts - 124, comments - 36, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          二叉樹最大的路徑和

          Posted on 2013-04-18 21:31 小明 閱讀(4013) 評論(0)  編輯  收藏 所屬分類: 數據結構和算法
          問題給定一個二叉樹,尋找最大的路徑和.
          路徑可以從任意節點開始到任意節點結束。(也可以是單個節點)

          比如:對于二叉樹
             1
            /  \
          2    3
          和最大的路徑是2->1->3,結果為6
          /**
           * Definition for binary tree
           * public class TreeNode {
           *     int val;
           *     TreeNode left;
           *     TreeNode right;
           *     TreeNode(int x) { val = x; }
           * }
           */

          分析:
          初看這個問題很難解,可能的路徑會非常多,遍歷所有的路徑,計算量非常大。
          二叉樹的問題天生適合使用分治算法和遞歸實現。
          對于二叉樹
              v
             /  \
            v1 v2
          有六種可能最大值v,v1,v2,v+v1,v+v2,v+v1+v2
          但是只有v,v+v1,v+v2這三個值的最大者才能返回給上一級。(為什么?因為要形成通往上一層的path,請仔細體會)

          代碼如下:

          public class Solution {
              private int max;
              
              private int travel(TreeNode node){
                  int v = node.val,v1=0,v2=0;
                  int result = v;
                  int mlocal = v;
                  int i = 0;
                  if(node.left!=null){
                      v1 = travel(node.left);
                      if(v1>0){
                          result = v+v1;
                      }
                      if(mlocal<v1){
                          mlocal = v1; 
                      }
                  }
                  if(node.right!=null){
                      v2 = travel(node.right);
                      if(result<v+v2){
                          result = v+v2;
                      }
                      if(mlocal<v2){
                          mlocal = v2;
                      }
                  }
                  if(mlocal<result){
                      mlocal = result;
                  }
                  if(mlocal < v+v1+v2){
                      mlocal = v+v1+v2;
                  }
                  if(max<mlocal){
                      max = mlocal;
                  }
                  return result;
              }
              
              public int maxPathSum(TreeNode root) {
                  max = Integer.MIN_VALUE;
                  travel(root);
                  return max;        
              }
          }












          主站蜘蛛池模板: 北流市| 朝阳区| 和平县| 盘锦市| 邛崃市| 仪征市| 轮台县| 皮山县| 灵璧县| 郴州市| 平山县| 土默特右旗| 吴堡县| 唐海县| 广西| 玛多县| 平乡县| 吉木乃县| 任丘市| 时尚| 上栗县| 江阴市| 阿合奇县| 博野县| 治县。| 东乌珠穆沁旗| 张家港市| 阿坝县| 溧阳市| 黎平县| 青冈县| 开阳县| 巴林左旗| 金堂县| 河东区| 祁门县| 德庆县| 崇信县| 长阳| 嘉黎县| 区。|