- leet:地址
- 分类:分治法(+递归)
- 相似题型:leet_241
- 题目描述:
- 给定一个int型数n,生成由数字1~n生成的所有满足BST(二叉搜索树)的二叉树。
- note:BST的定义:
- 左子树(如果非空)上所有结点的关键码都小于根结点的关键码。
- 右子树(如果非空)上所有结点的关键码都大于根结点的关键码。
- 左子树和右子树也是二叉搜索树。
- 输入输出样例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190731204827466.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dvbmVuZ2d1d296YWk=,size_16,color_FFFFFF,t_70)
- 分析:
- 该题与leet_241非常相似,同属于分治法。具体不在分析,但在代码实现过程中还存在困难,主要制约在二叉树相关处理不熟。还需加强。
- c++ 代码实现:
#include<iostream>
#include<vector>
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
std::vector<TreeNode*> generateTree(int from, int to)
{
std::vector<TreeNode*> ret;
if (from > to)
ret.push_back(nullptr);
else if (from == to)
ret.push_back(new TreeNode(from));
else
{
for (int i = from; i <= to; i++)
{
std::vector<TreeNode*> left_subtree = generateTree(from, i - 1);
std::vector<TreeNode*> right_subtree = generateTree(i + 1, to);
for (int j = 0; j < left_subtree.size(); j++)
{
for (int k = 0; k < right_subtree.size(); k++)
{
TreeNode* root = new TreeNode(i);
root->left = left_subtree[j];
root->right = right_subtree[k];
ret.push_back(root);
}
}
}
}
return ret;
}
std::vector<TreeNode*> generateTrees(int n) {
return generateTree(1, n);
}
};
void DFS(TreeNode* ptr)
{
if (ptr == nullptr)
return;
std::cout << ptr->val << " ";
if (ptr->left != nullptr)
DFS(ptr->left);
if (ptr->right != nullptr)
DFS(ptr->right);
}
int main()
{
Solution solution;
std::vector<TreeNode*> vec_root = solution.generateTrees(3);
for (auto ptr : vec_root)
{
DFS(ptr);
std::cout << std::endl;
}
system("pause");
return 0;
}
- 运行结果(这里展示的是深度优先遍历的结果,由遍历结果并不能唯一确定一棵二叉树,但可以验证结论题目要求的是用层序遍历输出结果。。。)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190731203434132.png)