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; } }