Leetcode 654 Maximum Binary Tree
- Create a root node whose value is the maximum value in nums.
- Recursively build the left subtree on the subarray prefix to the left of the maximum value.
- Recursively build the right subtree on the subarray suffix to the right of the maximum value. Return the maximum binary tree built from nums.
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.
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