1. 程式人生 > 實用技巧 >二叉樹最大路徑和

二叉樹最大路徑和

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