1、题目描述
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
2、解题思路
网上的解题方法有很多种,这里采用一种比较简单易懂的方法:DFS深度搜索
我下面使用的是c++代码。
注意:这里题目给出的结果返回值是vector<TreeNode*>,不要被题目中的输出结果所迷惑,以为是要输出一个二维数组。
所以题目的目的就是要输出所有可能结果的二叉搜索树的根指针。
我们首先对输入的区间[1,n]进行深度搜索,因为这里n个数字每一个都有可能是根节点,然后根据每一个可能为根节点的情况,对数字i左边的区间[1,i-1]以及数字i右边的区间[i+1,end]分别进行深度搜索,i左边的区间返回了结果vector<TreeNode*> left,i右边的返回了vector<TreeNode*> right,然后使用二重循环不断地new root指向左右区间中的根指针,并将结果root push到result中,最终返回正确结果。
3、代码
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
vector<TreeNode*> result;
if(n==0)
return result;
return task(1,n);
}
vector<TreeNode*> task(int start,int end)
{
vector<TreeNode*> result;
if(start>end)
{
result.push_back(nullptr);
return result;
}
for(int i=start;i<=end;i++)
{
vector<TreeNode*> left=task(start,i-1);
vector<TreeNode*> right=task(i+1,end);
for(int j=0;j<left.size();j++)
for(int k=0;k<right.size();k++)
{
TreeNode* root=new TreeNode(i);
root->left=left[j];
root->right=right[k];
result.push_back(root);
}
}
return result;
}
};