链接: 654. 最大二叉树

按照题意模拟即可。
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
n = len(nums)
def dfs(i,l,r):
root = TreeNode(nums[i])
m = -1
mi = -1
for j in range(l,i):
if nums[j]>m:
m = nums[j]
mi = j
if i > l:
root.left = dfs(mi,l,i-1)
if i<r:
m = -1
for j in range(i+1,r+1):
if nums[j]>m:
m = nums[j]
mi = j
root.right = dfs(mi,i+1,r)
return root
m = -1
mi = -1
for j in range(0,n):
if nums[j]>m:
m = nums[j]
mi = j
return dfs(mi,0,n-1)

class Solution:
def constructFromPrePost(self, preorder: List[int], postorder: List[int]) -> TreeNode:
def dfs(preorder,postorder):
if not preorder:
return None
root = TreeNode(preorder[0])
n = len(preorder)
if n == 1:
return root
width = postorder.index(preorder[1])+1 # 左子树长度
root.left = dfs(preorder[1:1+width], postorder[:width])
root.right = dfs(preorder[width+1:], postorder[width:n-1])
return root
return dfs(preorder,postorder)

链接: 1569. 将子数组重新排序得到同一个二叉查找树的方案数

class Solution:
def numOfWays(self, nums: List[int]) -> int:
MOD=10**9+7
def dfs(nums):
if not nums:
return 1
l,r = [],[]
for i in range(1,len(nums)):
if nums[i] < nums[0]:
l.append(nums[i])
else:
r.append(nums[i])
return comb(len(l)+len(r),len(r)) * dfs(l) *dfs(r) % MOD
return (dfs(nums) + MOD - 1)%MOD