1. 程式人生 > >[LeetCode]95 不同二分查詢樹之二

[LeetCode]95 不同二分查詢樹之二

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; } };