https://leetcode.com/problems/unique-binary-search-trees-ii/
Given n, generate all structurally unique BST’s (binary search trees) that store values 1…n.
For example,
Given n = 3, your program should return all 5 unique BST’s shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
Code
# 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 copy(self, root, bias): if not root: return root new_root = TreeNode(root.val + bias) new_root.left = self.copy(root.left, bias) new_root.right = self.copy(root.right, bias) return new_root def generateTrees(self, n): """ :type n: int :rtype: List[TreeNode] """ if n == 0: return [] ans = [[] for _ in xrange(n+1)] ans[0] = [None] for i in xrange(1, n+1): for j in xrange(1, i+1): # j is the root value for lt in ans[j-1]: for rt in ans[i-j]: root = TreeNode(j) root.left = self.copy(lt, 0) root.right = self.copy(rt, j) ans[i] += [root] return ans[-1]
Idea
To extend the idea of Leetcode 96, when you are given `n`, you can put `1~n` as roots. When you put `i` (`1<=i<=n`) as the root, the left tree is depending on the result of `i-1` and the right tree is depending on the result of `n-i`. For this problem, the right tree is not solely copy of the trees of `n-i`. Every node in the trees of `n-i` should be added a bias of `i`. Therefore, we create a recursive function `copy(self, root, bias)` to copy trees with biases.