1. 程式人生 > >【LeetCode】95. Unique Binary Search Trees II

【LeetCode】95. Unique Binary Search Trees II

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~n是升序列,因此建起來的樹天然就是BST。

遞迴思想,依次選擇根節點,對左右子序列再分別建樹。

由於左右子序列建樹的結果也可能不止一種,需要考慮所有搭配情況。

vector<TreeNode *> left代表所有valid左子樹。

vector<TreeNode *> right代表所有valid右子樹。

/**
 * Definition for binary tree
 * 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) { return Helper(1, n); } vector<TreeNode *> Helper(int begin, int end) { vector<TreeNode *> ret; if(begin > end) ret.push_back(NULL); else if
(begin == end) { TreeNode* node = new TreeNode(begin); ret.push_back(node); } else { for(int i = begin; i <= end; i ++) {//root vector<TreeNode *> left = Helper(begin, i-1); vector<TreeNode *> right = Helper(i+1, end); for(int l = 0; l < left.size(); l ++) { for(int r = 0; r < right.size(); r ++) { //new tree TreeNode* root = new TreeNode(i); root->left = left[l]; root->right = right[r]; ret.push_back(root); } } } } return ret; } };