一.题目
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
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
Show Tags
Have you met this question in a real interview?
Yes
No
二.解题技巧
这道题和Unique Binary Search Trees很相似,只是这道题可能无法使用动态规划减少计算的时间,因为每一个节点的值是不一样的,不存在相同的子问题的情况,因此,计算复杂度无法下降。使用递归的方式进行的时候,时间复杂度为O(n^3),空间复杂度为O(n)。
三.实现代码
#include <iostream>
#include <vector>
#include <unordered_map>
using std::vector;
using std::unordered_map;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution
{
private:
unordered_map<int, vector<TreeNode*> > PreResult;
vector<TreeNode*> generateTrees(int n, int base)
{
vector<TreeNode*> Result;
if (n == 0)
{
TreeNode* TmpNode = NULL;
Result.push_back(TmpNode);
return Result;
}
if (n == 1)
{
TreeNode* TmpNode = new TreeNode(n + base);
Result.push_back(TmpNode);
return Result;
}
for (int HeadIndex = 1; HeadIndex <= n; HeadIndex++)
{
vector<TreeNode*> LeftChildVector = generateTrees(HeadIndex - 1, base);
vector<TreeNode*> RightChildVector = generateTrees(n - HeadIndex, base + HeadIndex);
const vector<TreeNode*>::size_type LEFTSIZE = LeftChildVector.size();
const vector<TreeNode*>::size_type RIGHTSIZE = RightChildVector.size();
for (vector<TreeNode*>::size_type IndexOfLeft = 0; IndexOfLeft < LEFTSIZE; IndexOfLeft++)
{
for (vector<TreeNode*>::size_type IndexOfRight = 0; IndexOfRight < RIGHTSIZE; IndexOfRight++)
{
TreeNode *TmpHeadNode = new TreeNode(base + HeadIndex);
TmpHeadNode->left = LeftChildVector[IndexOfLeft];
TmpHeadNode->right = RightChildVector[IndexOfRight];
Result.push_back(TmpHeadNode);
}
}
}
return Result;
}
public:
vector<TreeNode*> generateTrees(int n)
{
return generateTrees(n, 0);
}
};
四.体会
这道题也是一个和Unique Binary Search Trees类似的问题,解题思路也比较类似,只是这个的返回是所有可能的二叉查找树,主要解答过程只是稍微修改下即可。
版权所有,欢迎转载,转载请注明出处,谢谢
