原文链接:https://blog.youkuaiyun.com/chilseasai/article/details/50083201
题目链接:https://leetcode.com/problems/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.
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
解题思路:
这题是 96 Unique Binary Search Trees 的延展,它已经不是让求不同构二叉树的种数,而是直接给出这些不同构的二叉树。
1. 每一次都在一个范围内随机选取一个结点作为根。
2. 每选取一个结点作为根,就把树切分成左右两个子树,直至该结点左右子树为空。
大致思路如上,可以看出这也是一个可以划分成子问题求解的题目,所以考点是动态规划。
但具体对于本题来说,采取的是自底向上的求解过程。
1. 选出根结点后应该先分别求解该根的左右子树集合,也就是根的左子树有若干种,它们组成左子树集合,根的右子树有若干种,它们组成右子树集合。
2. 然后将左右子树相互配对,每一个左子树都与所有右子树匹配,每一个右子树都与所有的左子树匹配。然后将两个子树插在根结点上。
3. 最后,把根结点放入链表中。
vector<TreeNode *> generateTrees(int n) {
return dfs(1, n);
}
vector<TreeNode*> dfs(int left, int right){
vector<TreeNode*> ans;
if(left > right){
ans.push_back(NULL);
return ans;
}
for(int i = left; i<= right; i++){
vector<TreeNode*> nodel = dfs(left, i-1);
vector<TreeNode*> noder = dfs(i+1, right);
for(auto l:nodel){
for(auto r:noder){
TreeNode *root = new TreeNode(i);
root->left = l;
root->right = r;
ans.push_back(root);
}
}
}
return ans;
}