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.