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