题意:给出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 };