• 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")
  • 相关阅读:
    近期安卓与IOS招聘面试有感
    java线程池技术(二): 核心ThreadPoolExecutor介绍
    java线程池技术(一):ThreadFactory与BlockingQueue
    Java设计模式之策略模式与状态模式
    java线程间通信:一个小Demo完全搞懂
    Android M 新的运行时权限开发者需要知道的一切
    Java多线程同步问题:一个小Demo完全搞懂
    java多线程之守护线程以及Join方法
    安卓电量优化之JobScheduler使用介绍
    安卓电量优化之WakeLock锁机制全面解析
  • 原文地址:https://www.cnblogs.com/ordili/p/9976254.html
Copyright © 2020-2023  润新知