二叉树最大路径和

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

  

原文地址:https://www.cnblogs.com/lyuwalle/p/13910358.html