95. 不同的二叉搜索树 II - 力扣(LeetCode)
和这个类似,但是这儿需要把二叉树生成出来:
LeetCode第 96 题:不同的二叉搜索树(C++)_qq_32523711的博客-CSDN博客
感觉自己处理这种问题还是不够熟练。。
明显使用递归嘛,序列为1, 2, … , n-1, n:
以 i i i ( i = 1 , 2 , 3... i = 1, 2,3... i=1,2,3...)为根节点,generateTrees(1,n)可由左子树集合generateTrees(1, i-1) 和 右子树generateTrees(i+1, n)里面分别选出一个,再和根节点 i i i 连接而成;而generateTrees(1, i-1)又可以像上一步一样继续分下去。
以上下界描述即为:
以
i
i
i (
l
o
w
<
=
i
<
=
h
i
g
h
low <= i <= high
low<=i<=high)为根节点,generateTrees(low,high)可由左子树集合generateTrees(low, i-1) 和 右子树generateTrees(i+1, high)里面分别选出一个,再和根节点
i
i
i 连接而成,也就是把序列[low, high]分成了[low, i-1],[i+1, high]两部分,而 i 作为根节点;
递归调用这两部分,一直划分下去,递归出口当 l o w > h i g h low > high low>high 的时候,返回空节点,那递归入口显然就是generateTrees(1, n)了。
class Solution {
public:
vector<TreeNode*> generateTrees(int low, int high){
if(low > high) return {NULL};
vector<TreeNode*> allTrees;
for(int i = low; i <= high; ++i){//以i为根节点
auto l_trees = generateTrees(low, i-1); //左边部分生成的所有树集合
auto r_trees = generateTrees(i+1, high); //右边部分生成的所有树集合
for(const auto &left : l_trees){
for(const auto &right : r_trees){
auto root = new TreeNode(i);
root->left = left;
root->right = right;
allTrees.push_back(root);
}
}
}
return allTrees;
}
vector<TreeNode*> generateTrees(int n) {
if(n == 0) return vector<TreeNode*>();
return generateTrees(1,n);
}
};