95. 不一樣的二叉搜索樹 II

95. 不一樣的二叉搜索樹 II

題意

給定一個整數 n,生成全部由 1 ... n 爲節點所組成的二叉搜索樹node

解題思路

這道題目是基於不一樣的二叉搜索樹進行改進的;web

對於連續整數序列[left, right]中的一點 i,若要生成以 i 爲跟結點的BST,則有以下的規律:app

  • i 左邊的序列能夠做爲左子樹結點,而且左兒子可能有多個,所以存在left_nodes = self.helper(left, i-1)ide

  • i 右邊的序列能夠做爲右子樹結點,而且右兒子可能有多個,所以存在right_nodes = self.helper(i+1, right)spa

  • 產生的以當前結點 i 爲跟結點的BST樹有len(left_nodes) * len(right_nodes)個,遍歷每一種狀況,便可以產生以 i 爲跟結點的BST序列,所以以 for 循環使得[left, right]中每一個結點都能生成子樹序列;code

一旦left大於right,則說明這裏沒法產生子樹,因此此處應該是做爲空結點返回;orm

實現

class Solution(object):
   def generateTrees(self, n):
       """
      :type n: int
      :rtype: List[TreeNode]
      """
       if n <= 0:
           return []

       return self.helper(1, n)

   def helper(self, left, right):
       result = []
       # 一旦left大於right,則說明這裏沒法產生子樹,因此此處應該是做爲空結點返回
       if left > right:
           result.append(None)
           return result

       for i in range(left, right+1):
           left_nodes = self.helper(left, i-1)
           right_nodes = self.helper(i+1, right)
           # 包括產生的以當前結點 i 爲跟結點的BST樹有len(left_nodes) * len(right_nodes)個,所以雙層遍歷
           for left_node in left_nodes:
               for right_node in right_nodes:
                   node = TreeNode(i)
                   node.left = left_node
                   node.right = right_node
                   result.append(node)

       return result
     
def generateTrees(self, n):
       """
      :type n: int
      :rtype: List[TreeNode]
      """
       if n <= 0:
           return []
       
       # 使用left,right表示左右兩邊結點對應個數的個數
       result = defaultdict(list)
       
       def helper(left, right):
           if left > right:
               return [None]
           # 避免重複執行
           if (left, right) in result:
               return result[(left, right)]
           
           for i in range(left, right+1):
               left_nodes = helper(left, i-1)
               right_nodes = helper(i+1, right)
               # 包括產生的以當前結點 i 爲跟結點的BST樹有len(left_nodes) * len(right_nodes)個,所以雙層遍歷
               for left_node in left_nodes:
                   for right_node in right_nodes:
                       node = TreeNode(i)
                       node.left = left_node
                       node.right = right_node
                       result[(left, right)].append(node)
           return result[(left, right)]
           
       return helper(1, n)
相關文章
相關標籤/搜索