Unique Binary Search Trees II
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.
解题思路
和 Unique Binary Search Trees 相比,本题要求返回所有的 structurally unique BST 而不是 structurally unique BST 的数目。 因此,动态规划在这里不太适用。
这里依然使用递归求解。每次选取一个结点为根,然后递归求解左右子树的所有结果,最后根据返回的所有左右子树,依次选取然后接到当前结点上(每个左子树依次和每一个右子树组合,总共有左右子树数量的乘积种情况),构造好之后作为当前树的结果返回。
代码入下:
/**
* 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 {
private:
vector<TreeNode*> internalGenerateTrees(int start, int end) {
vector<TreeNode *> result;
if (start > end) {
// 空树
result.push_back(NULL);
}
else {
for (int i = start; i <= end; ++i) {
// 递归求解左子树
vector<TreeNode*> lefts = internalGenerateTrees(start, i - 1);
// 递归求解右子树
vector<TreeNode*> rights = internalGenerateTrees(i + 1, end);
for (int m = 0; m < lefts.size(); ++m) {
for (int n = 0; n < rights.size(); ++n) {
// 每个左子树依次和每一个右子树组合
TreeNode *root = new TreeNode(i);
root->left = lefts[m];
root->right = rights[n];
result.push_back(root);
}
}
}
}
return result;
}
public:
vector<TreeNode*> generateTrees(int n) {
return internalGenerateTrees(1, n);
}
};