leetcode: 95. Unique Binary Search Trees II

来源:互联网 发布:锐科特思网络 编辑:程序博客网 时间:2024/06/16 09:33

Q

Given an integer 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

AC

# Definition for a binary tree node.class TreeNode(object):    def __init__(self, x):        self.val = x        self.left = None        self.right = Noneclass Solution(object):    def generateTrees(self, n):        """        :type n: int        :rtype: List[TreeNode]        """        return self.buildTree(0, n)    def buildTree(self, n1, n2):        if n1==n2:            return [None]        if n1+1 == n2:            node = TreeNode(n1+1)            node.left = None            node.right = None            return [node]        else:            results = []            for x in range(n1, n2):                left_list = self.buildTree(n1, x)                right_list = self.buildTree(x+1, n2)                for left in left_list:                    for right in right_list:                        node = TreeNode(x+1)                        node.left = left                        node.right = right                        results.append(node)            return results# Time:  O(4^n / n^(3/2)) ~= Catalan numbers# Space: O(4^n / n^(3/2)) ~= Catalan numbers# Definition for a  binary tree nodeclass TreeNode:    def __init__(self, x):        self.val = x        self.left = None        self.right = None    def __repr__(self):        if self:            serial = []            queue = [self]            while queue:                cur = queue[0]                if cur:                    serial.append(cur.val)                    queue.append(cur.left)                    queue.append(cur.right)                else:                    serial.append("#")                queue = queue[1:]            while serial[-1] == "#":                serial.pop()            return repr(serial)        else:            return Noneclass Solution2(object):    def generateTrees(self, n):        return self.generateTreesRecu(1, n)    def generateTreesRecu(self, low, high):        result = []        if low > high:            result.append(None)        for i in xrange(low, high + 1):            left = self.generateTreesRecu(low, i - 1)            right = self.generateTreesRecu(i + 1, high)            for j in left:                for k in right:                    cur = TreeNode(i)                    cur.left = j                    cur.right = k                    result.append(cur)        return resultif __name__ == "__main__":    print Solution().generateTrees(3)


原创粉丝点击