【LeetCode 中等題】50-不同的二叉搜尋樹II
阿新 • • 發佈:2019-01-07
題目描述:給定一個整數 n,生成所有由 1 ... n 為節點所組成的二叉搜尋樹。
示例:
輸入: 3 輸出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解釋: 以上的輸出對應以下 5 種不同結構的二叉搜尋樹: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
解法1。劃分左右子樹,遞迴構造。
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def generateTrees(self, n): """ :type n: int :rtype: List[TreeNode] """ if n == 0: return [] return self.dfs(1, n) def dfs(self, start, end): if start>end: return [None] res = [] for rootVal in range(start, end+1): leftTree = self.dfs(start, rootVal-1) rightTree = self.dfs(rootVal+1, end) for i in leftTree: for j in rightTree: node = TreeNode(rootVal) node.left = i node.right = j res.append(node) return res
解法2。用記憶搜尋改良,用一個dict儲存計算過的(start, end)的結果,避免重複計算
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def generateTrees(self, n): """ :type n: int :rtype: List[TreeNode] """ if n == 0: return [] memo = {} self.dfs(1, n, memo) return memo[(1, n)] def dfs(self, start, end, memo): if start>end: return [None] if (start, end) in memo: return memo[(start,end)] res = [] for rootVal in range(start, end+1): leftTree = self.dfs(start, rootVal-1, memo) rightTree = self.dfs(rootVal+1, end, memo) for i in leftTree: for j in rightTree: node = TreeNode(rootVal) node.left = i node.right = j res.append(node) memo[(start, end)] = res return res # 這個地方一定要有返回值,不然上面的leftTree和rightTree會得不到返回值
參考連結:https://blog.csdn.net/qq_17550379/article/details/84635060