給定 1..n,生成所有由這 n 個節點構成的、結構不同的二叉搜索樹,返回根節點列表。
n = 3 輸出 5 棵樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
start..end,枚舉每個 root 作為根節點。start..root-1 構成,右子樹由 root+1..end 構成。root 為根的所有樹。map, vector> 緩存。class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def generateTrees(self, n):
if n == 0: return []
self.cache = {}
return self._generate(1, n)
def _generate(self, start, end):
if (start, end) in self.cache:
return self.cache[(start, end)]
roots = []
for root_val in range(start, end + 1):
for left in self._generate(start, root_val - 1):
for right in self._generate(root_val + 1, end):
node = TreeNode(root_val)
node.left = left
node.right = right
roots.append(node)
self.cache[(start, end)] = roots or [None]
return self.cache[(start, end)]
vector,需注意記憶體管理(競賽環境通常忽略釋放)。map, vector> 或 vector> 。start > end 返回 {nullptr}。C_n = (2n)!/((n+1)!n!),輸出敏感,無法進一步優化。