1. 程式人生 > 實用技巧 >[leetCode]654. 最大二叉樹

[leetCode]654. 最大二叉樹

題目

連結:https://leetcode-cn.com/problems/maximum-binary-tree

給定一個不含重複元素的整數陣列。一個以此陣列構建的最大二叉樹定義如下:

二叉樹的根是陣列中的最大元素。
左子樹是通過陣列中最大值左邊部分構造出的最大二叉樹。
右子樹是通過陣列中最大值右邊部分構造出的最大二叉樹。
通過給定的陣列構建最大二叉樹,並且輸出這個樹的根節點。

示例 :

輸入:[3,2,1,6,0,5]
輸出:返回下面這棵樹的根節點:

      6
    /   \
   3     5
    \    / 
     2  0   
       \
        1

遞迴

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        if (nums.length == 0) return null;
        return traversal(nums, 0, nums.length - 1);
    }

    // 左閉右閉區間
    private TreeNode traversal(int[] nums, int begin, int end) {
        // 說明切割完畢返回空
        if (begin > end) return null;
        // 尋找切割點下標
        int rootIndex = getMax(nums, begin, end);
        TreeNode root = new TreeNode(nums[rootIndex]);
        if (begin == end) return root;
        // 切割左子樹
        int leftBegin = begin;
        int leftEnd = rootIndex - 1;
        // 切割右子樹
        int rightBegin = rootIndex + 1;
        int rightEnd= end;
        // 遞迴
        root.left = traversal(nums, leftBegin, leftEnd);
        root.right = traversal(nums, rightBegin, rightEnd);
        return root;
    }

    // 獲取陣列中指定範圍內最大值的下標
    private int getMax(int[] nums, int begin, int end) {
        int max = begin;
        for (int i = begin + 1; i <= end; i++) {
            if (nums[i] > nums[max])
                max = i;
        }
        return max;
    }
}