题目描述
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
解题思路
递归法
:通过循环遍历每一个元素,作为根节点,比它小的元素只能属于他的左子树,比它大的节点属于它的右子树,左子树与右子树的所有可能利用递归方法,将所有可能的左子树存放在lefts
中,右子树的可能存放在rights
中
Cpp实现
/**
* 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*> res;
if(n < 1)
return res;
else
return helper(1,n);
}
vector<TreeNode*> helper(int start,int end){
vector<TreeNode*> res;
if(start > end)
res.push_back(NULL);
for(int i = start;i <= end;i++){
vector<TreeNode*> lefts = helper(start,i - 1);
vector<TreeNode*> rights = helper(i + 1,end);
for(auto left:lefts){
for(auto right:rights){
TreeNode* root = new TreeNode(i);
root->left = left;
root->right = right;
res.push_back(root);
}
}
}
return res;
}
};