思路:
1.找出nums中最大值及其索引;
2.将最大值赋值给root.val;
3.将nums用索引分成左右两部分,分别递归传入递归函数;
注意:
4.root.left 和 root.right 分别接着左右生成好的子树
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
def constructTree(num: List[int]) -> Optional[TreeNode]:
if num == []:
return
max, index = 0, 0
for i, j in enumerate(num):
if j > max:
max = j
index = i
root = TreeNode(num[index])
num_left = num[:index]
num_right = num[index + 1 : ]
root.left = constructTree(num_left)
root.right = constructTree(num_right)
return root
return constructTree(nums)
用此方法可以不用在递归函数里反复新建数组。节约时间和空间。
class Solution:
"""最大二叉树 递归法"""
def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
return self.traversal(nums, 0, len(nums))
def traversal(self, nums: List[int], begin: int, end: int) -> TreeNode:
# 列表长度为0时返回空节点
if begin == end:
return None
# 找到最大的值和其对应的下标
max_index = begin
for i in range(begin, end):
if nums[i] > nums[max_index]:
max_index = i
# 构建当前节点
root = TreeNode(nums[max_index])
# 递归构建左右子树
root.left = self.traversal(nums, begin, max_index)
root.right = self.traversal(nums, max_index + 1, end)
return root