难度:Medium ?:1392
给定整数n,返回一个列表,其中包含全部可能的包含数字1~n的BST(二叉搜索树)
学习coordinate_blog的解法,原博文链接:
Leetcode 95:不同的二叉搜索树 II(超详细的解法!!!)
思路
如果以 i 作为根节点,那么数字 1~i 在左子树中,数字i+1 ~ n在右子树中。
这是一个递归问题。
基本的函数应当有两个参数,left , right ,返回所有可能的BST。
优化:采用记忆化搜索的办法,节约时间。
解答
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:
if n==0:
return []
mem = dict()
self._generate_trees(1,n,mem)
return mem[(1,n)]
def _generate_trees(self,left,right,mem):
if left>right:
return [None] #空节点
if (left,right) in mem: #记忆化搜索
return mem[(left,right)]
result = list()
for i in range(left,right+1):
leftnodes = self._generate_trees(left,i-1,mem)
rightnodes = self._generate_trees(i+1,right,mem)
for leftnode in leftnodes:
for rightnode in rightnodes:
root = TreeNode(i)
root.left = leftnode
root.right = rightnode
result.append(root)
mem[(left,right)] = result
return result