题目描述:
Given an integer 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
解题思路:
由于这道题的要求是返回所有BST的根节点,因此要从二叉树的末尾开始添加节点,先获取左子树的所有可能性,再获取右子树的所有可能性,然后将两者组合起来。
代码:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<TreeNode*> addTrees(int beg, int end){ 13 vector<TreeNode*> ret; 14 if(beg > end){ 15 //子树不存在 16 ret.push_back(NULL); 17 return ret; 18 } 19 if(beg == end){ 20 //子树唯一节点 21 TreeNode *p = new TreeNode(beg); 22 ret.push_back(p); 23 return ret; 24 } 25 for(int i = beg; i <= end; i++){ 26 //获取两子树组合的所有可能性,作为这一层子树返回 27 vector<TreeNode*> left = addTrees(beg, i-1); //获取下一层左子树 28 vector<TreeNode*> right = addTrees(i+1, end); //获取下一层右子树 29 for(int j = 0; j < left.size(); j++){ 30 for(int k = 0; k < right.size(); k++){ 31 //组合 32 TreeNode* root = new TreeNode(i); 33 root->left = left[j]; 34 root->right = right[k]; 35 ret.push_back(root); 36 } 37 } 38 } 39 return ret; 40 } 41 vector<TreeNode*> generateTrees(int n) { 42 if(n < 1) 43 return vector<TreeNode*>(NULL); 44 return addTrees(1, n); 45 } 46 };