给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
这个题不会做,不知道保存的格式是啥。。。于是上网找了一下,把代码注释了一下,基本差不多了
这个答案是这样的,比如:[3,1,null,null,2] 想要表达的是,根节点是3,左子树是1,右子树是null,左子树是1为根的时候,1的左子树是null,右子树是2.
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
vector<TreeNode*> t;
if(n==0) return t;
return f(1, n);
}
vector<TreeNode*> f(int l, int r){
//表示,遍历从l到r所有节点作为根节点时的所有情况
vector<TreeNode*>ans;
if(l==r){
//只有这一个节点,这个节点左右子树都是空
TreeNode *root = new TreeNode(l);
ans.push_back(root);
}
else if(l>r){
//空节点,返回空的指针
ans.push_back(NULL);
}
else{
//如果l<r,说明,有左子树或者右子树
for (int i = l; i <= r; ++i) {
//遍历所有从l到r的节点,让他们依次做根节点
vector<TreeNode*> left_tree = f(l, i-1);
vector<TreeNode*> right_tree = f(i+1, r);
for (int a = 0; a < left_tree.size(); ++a) {
for (int b = 0; b < right_tree.size(); ++b) {
TreeNode *root = new TreeNode(i);
root->left = left_tree[a];
root->right = right_tree[b];
ans.push_back(root);
}
}
}
}
// 这里返回的是根节点的指针的vector
// 这个返回值代表的意思是,这个ans里面存了所有当前树的根节点指针,
// 就是,如果l=2,r=4,里面就保存了根节点为:2,3,4时候,所有子树的情况,
// 而且,当根节点为3的时候,左右子树的根可以分别为[1,2]和[4],那么,需要组合所有情况,
// 就是,当根节点为3时,左右子树的根节点分别为[1,4]或者[2,4]
// 通过这个根节点指针,可以找到相应的左子树和右子树,
return ans;
}
};
来源:CSDN
作者:abc15766228491
链接:https://blog.csdn.net/abc15766228491/article/details/82745842