二叉树最大路径和
1. 题目描述
输入一个二叉树层次遍历的结果,输出这个二叉树最大路径和。路径不一定从根节点开始和叶子节点结束。只要是连续的路径就可以。
如
输入:[-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7 输出:42
2. 代码
首先将一个数组还原成一个二叉树。
然后根绝二叉树的根节点返回最大路径和。
class Main{
public static void main(String[] args){
Object[] layers = new Object[]{-10,9,20,null,null,15,7};
Object[] layers2 = new Object[]{-4,1,3};
TreeNode root = CovertToNode(layers2, 0);
System.out.println(new Main().maxPathSum(root));
}
//把输入的一个数组转成二叉树,返回根节点
private static TreeNode CovertToNode(Object[] layers, int index) {
if(index >= layers.length){
return null;
}
Object o = layers[index];
if(o == null){
return null;
}else{
TreeNode node = new TreeNode((Integer)layers[index]);
node.left = CovertToNode(layers, 2 * index + 1);
node.right = CovertToNode(layers, 2 * index + 2);
return node;
}
}
//begin
public int max = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root){
maxGain(root);
return max;
}
private int maxGain(TreeNode root) { //表示经过节点root的最大路径和
if(root == null){
return 0;
}
int left = Math.max(maxGain(root.left), 0); //root左侧节点的路径最大值
int right = Math.max(maxGain(root.right), 0);
int value = left + root.val + right;
max = Math.max(max, value);
return root.val + Math.max(left, right);
}
//end
}
//定义一个二叉树节点
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
this.left = null;
this.right = null;
}
}

浙公网安备 33010602011771号