二叉樹最大路徑和
阿新 • • 發佈:2020-11-01
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; } }