LeetCode 95. 不同的二叉搜索树 II

题意:给出n,求出1~n所构造的BST集合。   (由于返回值是vector<TreeNode*>,我刚开始还没看懂这是什么意思.....)

 

解题思路:

  • 对于一棵BST,很显然,其左右子树都是BST。
  • 因为要构造所有BST,因此每个结点都可能是根结点。
  • 那么建立一个函数BuildTree(int left,int right),   建立包括[left,right)的所有BST,在函数内,需要for来选取每个结点作为根结点。
  • 接下来就是容易出问题的地方。   刚开始我是这样定义:   TreeNode* BuildTree(int left,int right);      然后在内部,  root->left=BuildTree(left,i);   root->right=BuildTree(i+1,right);   结果在运行的时候发现怎么少了一些树。      问题根源:在这样的BuildTree中,对于每个root,只会返回一棵子树。(即使你循环了n次,只在最后一次进行返回,因此只返回一棵子树)。
  • 纠正:vector<TreeNode*> BuildTree(int left,int right),返回包含[left,right)的所有BST!!!     

 

另外,LeetCode还是能够cout进行调试,系统会在下面显示标准输出!!!(下次关于LeetCode的调试还是做一篇总结,不会调试还是挺麻烦的。)

 

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<TreeNode*> BuildTree(int left,int right){
13         vector<TreeNode*> v;
14         // 必须加上,否则会v.size()=0;
15         if(left>=right){
16             v.push_back(NULL);
17         }
18         else{
19             TreeNode* head;
20             for(int i=left;i<right;i++){
21                 // 左右BST子树的根结点;
22                 vector<TreeNode*> v1=BuildTree(left,i);
23                 vector<TreeNode*> v2=BuildTree(i+1,right);
24                 // 双重循环建立BST
25                 for(int j=0;j<v1.size();j++){
26                     for(int k=0;k<v2.size();k++){
27                         head=new TreeNode(i);
28                         head->left=v1[j];
29                         head->right=v2[k];
30                         v.push_back(head);        
31                     }
32                 }
33             }
34         }
35         
36 //        cout<<v.size()<<endl;   //  调试    
37         return v;
38     }
39     
40     vector<TreeNode*> generateTrees(int n) {
41         TreeNode* head;
42         vector<TreeNode*> v;
43         // 如果n==0,那么是没有元素的,根据我的写法,会产生[null]。 
44         if(n==0){
45             return v;
46         }
47         v=BuildTree(1,n+1);
48         return v;
49     }
50 };                                    

 

posted @ 2019-09-26 21:01  B_luePhantom  阅读(267)  评论(0编辑  收藏  举报