题目链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/
解法1:递归
二叉搜索树的性质:左子树所有节点小于根节点,右子树所有节点大于根节点。
所有我们选择好根节点,将剩余节点分到左右子树,然后再分别对左右子树进行选择根节点,分好左右子树。直到如果只有一个数字,那么就只有这一种情况,把这一节点作为一棵树返回,如果没有数字,则直接返回null
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
class Solution { private: vector<TreeNode*> res; public: vector<TreeNode*> generateTrees(int n) { vector<TreeNode*> res; if(n==0) return res; return getres(1,n); } vector<TreeNode*> getres(int start,int end) { vector<TreeNode*> res; if(start>end) { res.push_back(NULL); return res; } if(start==end) { TreeNode *tree=new TreeNode(start); res.push_back(tree); return res; } int i; for(i=start;i<=end;i++) { vector<TreeNode*> leftTrees=getres(start,i-1); vector<TreeNode*> rightTrees=getres(i+1,end); for(TreeNode *leftTree:leftTrees) { for(TreeNode *rightTree:rightTrees) { TreeNode *root=new TreeNode(i); root->left=leftTree; root->right=rightTree; res.push_back(root); } } } return res; } };
|