给定一个整数 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); } };
转载于:https://www.cnblogs.com/programyang/p/11166658.html