思路:尋找一個樹的最大路徑,即任意兩個節點之間經過的路徑的最大值,這個值指的是所經過的點的值的和。
一個點的最大路徑,可以存在四種情況。①自己+左子樹②自己+右子樹③自己④自己加左右子,我們只要求出這四種情況下最大的,就是我們的答案,利用樹的特點遞歸求解。
package DSImp;
import java.util.*;
public class MaxTreeSum {
static Scanner in = new Scanner(System.in);
static int res = -1;
static int solve(TreeNode root) {
if (root == null)
return 0;
int left = solve(root.left);
int right = solve(root.right);
int temp = Math.max(left+root.val, right+root.val);//左、右最大的
int returnmax = Math.max(root.val, temp);//左、右、自己裏面最大的
int curmax = Math.max(returnmax,left+right+root.val);//左、右、自己、左+右最大的
res = Math.max(res, curmax);//更新最大值
return returnmax;
}
static TreeNode BuildTree(int[] a, int i) {//建立完全二叉樹
int len = a.length;
if (i >= len)
return null;
TreeNode root = new TreeNode(a[i]);
root.left = BuildTree(a, 2 * i);
root.right = BuildTree(a, 2 * i + 1);
return root;
}
static void print(TreeNode head) {//先序遍歷
if (head == null)
return;
System.out.print(head.val + " ");
print(head.left);
print(head.right);
}
public static void main(String[] args) {
// int[] a = { 0,1,2,3,4,5,6,7};
int[] a = { 0,1,8,1,3,2};
TreeNode head = BuildTree(a, 1);
solve(head);
System.out.println(res);
print(head);
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}