[LeetCode]95 不同二分查詢樹之二
阿新 • • 發佈:2019-02-15
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;
}
};