Unique Binary Search Trees II(不同二分查找树之二)
【难度:Medium】
Given n, generate all structurally unique BST’s (binary search trees) that store values 1…n.
For example,
Given n = 3, your program should return all 5 unique BST’s shown below.
在LeetCode 96题的基础上,给定序列1……n,构建所有不同的BST。
解题思路
在96题的基础上,我们知道,构建的所有不同BST是:选定root节点i(1<=i<=n),以1……(i-1)构建的所有BST为左子树,和以(i+1……n)构建的所有BST为右子树所组成的集合。根据该思想,我们可以通过分治、递归来解决此问题。代码则是在求BST总数的基础上,变为构建出所有BST。
c++代码如下:
/**
* 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*> tmp;
if (n == 0)
return tmp;
tmp = createBST(1,n);
return tmp;
}
//递归函数
vector<TreeNode*> createBST(int start, int end) {
vector<TreeNode*> ans;
if (start > end) {
ans.push_back(NULL);
return ans;
}
for (int i = start; i <= end; i++) {
//以i为界限,划分为两个区间[start,i-1]和[i+1,end];
//遍历左区间的所有子树
for (auto left:createBST(start,i-1)) {
//遍历右区间的所有子树
for (auto right:createBST(i+1,end)) {
//以i为root节点将左右子树组合起来
ans.push_back(new TreeNode(i));
ans.back()->left = left;
ans.back()->right = right;
}
}
}
return ans;
}
};