LeetCode 95. 不同的二叉搜索树 II
给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:
算法:我们从1到n进行遍历,每次以这之中的某个点作为根结点,然后递归创建左子树与右子树。时间复杂度满足卡特兰数(C(n,2n)/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*> dfs(int l, int r){ vector<TreeNode*>res; if(l>r){ res.push_back(NULL); return res; } for(int i=l;i<=r;i++){ auto left=dfs(l,i-1); auto right=dfs(i+1,r); for(auto &lc:left) for(auto &rc:right){ TreeNode* root=new TreeNode(i); root->left=lc; root->right=rc; res.push_back(root); } } return res; } vector<TreeNode*> generateTrees(int n) { if(!n)return {}; return dfs(1,n); } };