本次博客,我将记录leetcode95,不同的二叉搜索树
本题要求我们从1~n构造不同的二叉搜索树
因为好久不碰数据结构了,导致对二叉搜索树的概念十分模糊
以下是一些概念:
二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。
性质如下:
1.非空左子树的所有键值小于其根结点的键值。
2.非空右子树的所有键值大于其根结点的键值。
3.左、右子树都是二叉搜索树。
本题关键点在于构造出所有不同的二叉搜索树,因此对于当前节点i
,我们可以将其一分为二,即1~i-1
和i+1~n
两部分,这两部分分别作为当前i
节点的左子树和右子树
我们只需对每个i
分别构造出其左子树和右子树,然后再将其拼接到当前节点的left
和right
子节点
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<TreeNode*> dfs(int x, int n){
if(x>n){
return {nullptr};
}
vector<TreeNode*> res;
for(int i=x;i<=n;i++){
vector<TreeNode*> ltree = dfs(x, i-1);
vector<TreeNode*> rtree = dfs(i+1, n);
for(auto& left:ltree){
for(auto& right:rtree){
TreeNode* currTree = new TreeNode(i);
currTree->left = left;
currTree->right = right;
res.push_back(currTree);
}
}
}
return res;
}
vector<TreeNode*> generateTrees(int n) {
return dfs(1, n);
}
};
标签:right,TreeNode,int,二叉,II,搜索,95,LeetCode,left
From: https://www.cnblogs.com/Sky6634/p/17744110.html