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
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
思路:DFS。取i作为根节点,递归求1->i-1和 i+1->n的二叉搜索树,置于 vector<TreeNode *> left 和vector<TreeNode *> right 之中,然后取i作为根节点,组合数组left和right,分别取一个元素作为root的左右子树,然后将组合之后的树置于result之中,最后返回result即可。注意一个特殊情况,当start>end,将空节点写入result,返回result,代表返回一个空节点。还有就是初始n<1的特殊处理。
/** * 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) { if(n<1){ vector<TreeNode *> result; return result; } return help(1,n); } vector<TreeNode *> help(int start,int end){ vector<TreeNode *> result; if(start>end){ result.push_back(NULL); return result; } for(int i=start;i<=end;i++){ vector<TreeNode *> left =help(start,i-1); vector<TreeNode *> right=help(i+1,end); for(int j=0;j<left.size();j++){ for(int k=0;k<right.size();k++){ TreeNode *root =new TreeNode(i); root->left=left[j]; root->right=right[k]; result.push_back(root); } } } return result; } };