小明思考

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

          二叉樹最大的路徑和

          Posted on 2013-04-18 21:31 小明 閱讀(4014) 評論(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;        
              }
          }












          主站蜘蛛池模板: 二手房| 白玉县| 诸城市| 五原县| 韶山市| 外汇| 庆阳市| 新闻| 石首市| 鸡东县| 金湖县| 望江县| 儋州市| 宝丰县| 玉门市| 黔西| 元朗区| 南木林县| 扎兰屯市| 九台市| 襄城县| 平山县| 印江| 剑阁县| 太原市| 喀喇沁旗| 陕西省| 新乡市| 呈贡县| 抚顺市| 贺兰县| 宜春市| 韩城市| 黄浦区| 竹溪县| 德保县| 昂仁县| 寻甸| 台东县| 修水县| 垦利县|