Leetcode 654 Maximum Binary Tree

  1. Create a root node whose value is the maximum value in nums.
  2. Recursively build the left subtree on the subarray prefix to the left of the maximum value.
  3. Recursively build the right subtree on the subarray suffix to the right of the maximum value. Return the maximum binary tree built from nums.
image
Input: nums = [3,2,1,6,0,5] Output: [6,3,5,null,2,0,null,null,1] Explanation: The recursive calls are as follow: - The largest value in [3,2,1,6,0,5] is 6. Left prefix is [3,2,1] and right suffix is [0,5]. - The largest value in [3,2,1] is 3. Left prefix is [] and right suffix is [2,1]. - Empty array, so no child. - The largest value in [2,1] is 2. Left prefix is [] and right suffix is [1]. - Empty array, so no child. - Only one element, so child is a node with value 1. - The largest value in [0,5] is 5. Left prefix is [0] and right suffix is []. - Only one element, so child is a node with value 0. - Empty array, so no child.
image
Input: nums = [3,2,1] Output: [3,null,2,null,1]
  • Using DFS to recursively get the sub-list which contains the numbers that represented node values for left sub-stree. Convert the maximum value of current list be the root node of sub-tree. Then the left parts of list that exclusice the maximum value will constructed as left sub-stree of the current root. And the right parts of list that exclusice the maximum value will constructed as right substree of the current root.

  • Conditions

  • If there is no value in the list, which means there are no more nodes to construct the sub-tree, terminate the current recursion. After done the recursion, return the root node of the tree

def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
        if not nums:return
        mx = max(nums)
        index=nums.index(mx)
        root = TreeNode(mx)
        root.left = self.constructMaximumBinaryTree(nums[:index])
        root.right = self.constructMaximumBinaryTree(nums[index+1:])
        return root