95. Unique Binary Search Trees II

1. Question:

95. Unique Binary Search Trees II

Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ... n.

Example:

Input: 3
Output:
[
  [1,null,3,2],
  [3,2,null,1],
  [3,1,null,null,2],
  [2,1,3],
  [1,null,2,null,3]
]
Explanation:
The above output corresponds to the 5 unique BST's shown below:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

2. Solution:
# 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 genTrees(self, values):
        size = len(values)
        if size <= 0:
            return []
        re_list = []

        if size == 1:
            node = TreeNode(values[0])
            re_list.append(node)
            return re_list

        for i in range(size):
            left_list = self.genTrees(values[:i])
            right_list = self.genTrees(values[i + 1:])

            if len(left_list) == 0:
                for right in right_list:
                    root = TreeNode(values[i])
                    root.right = right
                    re_list.append(root)
                continue

            if len(right_list) == 0:
                for left in left_list:
                    root = TreeNode(values[i])
                    root.left = left
                    re_list.append(root)
                continue

            for left in left_list:
                for right in right_list:
                    root = TreeNode(values[i])
                    root.left = left
                    root.right = right
                    re_list.append(root)

        return re_list

    def generateTrees(self, n):
        """
        :type n: int
        :rtype: List[TreeNode]
        """
        re_list = []

        if n == 1:
            root = TreeNode(1)
            re_list.append(root)
            return re_list

        for value in range(1, n + 1):
            left_list = self.genTrees(list(range(1, value)))
            right_list = self.genTrees(list(range(value + 1, n + 1)))

            if len(left_list) == 0:
                for right in right_list:
                    root = TreeNode(value)
                    root.right = right
                    re_list.append(root)
                continue

            if len(right_list) == 0:
                for left in left_list:
                    root = TreeNode(value)
                    root.left = left
                    re_list.append(root)
                continue

            for left in left_list:
                for right in right_list:
                    root = TreeNode(value)
                    root.left = left
                    root.right = right
                    re_list.append(root)

        return re_list


if __name__ == "__main__":
    obj = Solution()
    re = obj.generateTrees(3)
    print(re)
    print("Done")

 

posted @ 2018-11-17 23:26  ordi  阅读(126)  评论(0编辑  收藏  举报