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