February 24, 2019

95. Unique Binary Search Trees II

95. Unique Binary Search Trees II

递归。晕。。。

# 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]:
        
        return self.generate_trees(1, n) if n else []
    
    def generate_trees(self, start, end):
        all_trees = []
        
        # termination condition
        if start > end:
            return [None]
        
        # recursion rule
        for i in range(start, end + 1):
            # All possible left subtrees if i is chosen to be a root
            left_trees = self.generate_trees(start, i - 1)
            
            # All possible right subtrees if i is chosen to be a root
            right_trees = self.generate_trees(i + 1, end)
            
            # connect left and right subtrees to be the root i
            for l in left_trees:
                for r in right_trees:
                    current_tree = TreeNode(i)
                    current_tree.left = l
                    current_tree.right = r
                    all_trees.append(current_tree)
        return all_trees
comments powered by Disqus