思路:在能夠遍歷所有節點的遞歸中嵌套對於該節點延伸出的最長路徑的計算,然後利用類變量記錄下最長路徑。由於要計算每個根節點延伸出的最長路徑,可以先計算該根節點的左、右節點爲起點的最長路徑,然後取最長的組合。遞歸就可以寫成計算根節點爲起點最長路徑的函數,然後遞歸成左節點爲起點,右節點爲起點,正好可以遍歷所有節點。
/**
* Created by marsares on 15/6/14.
*/
public class BinaryTreeMaximumPathSum {
int maxPath=0;
public int maxPathSum(TreeNode root) {
maxPath=root.val;
maxPathFromP(root);
return maxPath;
}
public int maxPathFromP(TreeNode root){
if(root==null)return 0;
int left=maxPathFromP(root.left);
int right=maxPathFromP(root.right);
int val=max(root.val+left+right,max(root.val,max(root.val+left,root.val+right)));
if(val>maxPath)maxPath=val;
return max(root.val,max(root.val+left,root.val+right));
}
private int max(int a,int b){
return (a>b)?a:b;
}
public static void main(String[]args){
BinaryTreeMaximumPathSum btmp=new BinaryTreeMaximumPathSum();
BinaryTreeSerialize bts=new BinaryTreeSerialize();
TreeNode root=bts.Unserialize("{1,2,3,4,5,6,7,8,9}");
System.out.println(btmp.maxPathSum(root));
}
}