1.不同的二叉搜索树
给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。
思路:递归
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<TreeNode*> generateTrees(int start, int end) { if (start > end) { return { nullptr }; } vector<TreeNode*> allTrees; // 枚举可行根节点 for (int i = start; i <= end; i++) { // 获得所有可行的左子树集合 vector<TreeNode*> leftTrees = generateTrees(start, i - 1); // 获得所有可行的右子树集合 vector<TreeNode*> rightTrees = generateTrees(i + 1, end); // 从左子树集合中选出一棵左子树,从右子树集合中选出一棵右子树,拼接到根节点上 for (auto& left : leftTrees) { for (auto& right : rightTrees) { TreeNode* currTree = new TreeNode(i); currTree->left = left; currTree->right = right; allTrees.emplace_back(currTree);//插入一棵树 } } } return allTrees; } vector<TreeNode*> generateTrees(int n) { if (!n) { return {}; } return generateTrees(1, n); } };