LeetCode_Unique Binary Search Trees II

2015-11-21 00:58:35 · 作者: · 浏览: 5

一.题目

Unique Binary Search Trees II

Total Accepted: 32757 Total Submissions: 117071My Submissions

?

Given 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

?

confused what {1,#,2,3} means? > read more on how binary tree is serialized on OJ.

?

Show Tags Have you met this question in a real interview? Yes No

Discuss












二.解题技巧

这道题和Unique Binary Search Trees很相似,只是这道题可能无法使用动态规划减少计算的时间,因为每一个节点的值是不一样的,不存在相同的子问题的情况,因此,计算复杂度无法下降。使用递归的方式进行的时候,时间复杂度为O(n^3),空间复杂度为O(n)。


三.实现代码

#include 
  
   
#include 
   
     #include 
    
      using std::vector; using std::unordered_map; /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { private: unordered_map
     
       > PreResult; vector
      
        generateTrees(int n, int base) { vector
       
         Result; if (n == 0) { TreeNode* TmpNode = NULL; Result.push_back(TmpNode); return Result; } if (n == 1) { TreeNode* TmpNode = new TreeNode(n + base); Result.push_back(TmpNode); return Result; } for (int HeadIndex = 1; HeadIndex <= n; HeadIndex++) { vector
        
          LeftChildVector = generateTrees(HeadIndex - 1, base); vector
         
           RightChildVector = generateTrees(n - HeadIndex, base + HeadIndex); const vector
          
           ::size_type LEFTSIZE = LeftChildVector.size(); const vector
           
            ::size_type RIGHTSIZE = RightChildVector.size(); for (vector
            
             ::size_type IndexOfLeft = 0; IndexOfLeft < LEFTSIZE; IndexOfLeft++) { for (vector
             
              ::size_type IndexOfRight = 0; IndexOfRight < RIGHTSIZE; IndexOfRight++) { TreeNode *TmpHeadNode = new TreeNode(base + HeadIndex); TmpHeadNode->left = LeftChildVector[IndexOfLeft]; TmpHeadNode->right = RightChildVector[IndexOfRight]; Result.push_back(TmpHeadNode); } } } return Result; } public: vector
              
                generateTrees(int n) { return generateTrees(n, 0); } };
              
             
            
           
          
         
        
       
      
     
    
   
  




四.体会

这道题也是一个和Unique Binary Search Trees类似的问题,解题思路也比较类似,只是这个的返回是所有可能的二叉查找树,主要解答过程只是稍微修改下即可。


?