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 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3 提示:

  • 0 <= n <= 8

解题思路

递归 深度优先 二叉搜索树 创建二叉树
i 从 start 到 end,
[start,i-1] 作为 i 的左子树, [i+1,end] 作为 i 的右子树
左子树,右子树向下递归
递归终止条件 start > end , 返回 NULL
每一层以 i 作为根结点,新建根结点, [start,i-1] 作为 i 的左子树, [i+1,end] 作为 i 的右子树

例子
[1 2]
null 2
null null
———————-
1
null 2
null null
———————-
1 null
null null
——————-
2
1 null
null null

  1. class Solution {
  2. public:
  3. vector<TreeNode*> getTrees(int start,int end) {
  4. if(start > end) return {NULL};
  5. vector<TreeNode*> res;//局部变量
  6. // [start,i-1] 作为 i 的左子树, [i+1,end] 作为 i 的右子树,
  7. for(int i = start;i <= end; i++) {
  8. vector<TreeNode*> leftSubTree = getTrees(start,i-1);
  9. vector<TreeNode*> rightSubTree = getTrees(i+1,end);
  10. //从多种左子树中选一个作为根结点的左子树,从多种右子树中选一个作为根结点的右子树,
  11. for(auto& left:leftSubTree) {
  12. for(auto& right:rightSubTree) {
  13. TreeNode* curNode = new TreeNode(i);
  14. curNode->left = left;
  15. curNode->right = right;
  16. res.push_back(curNode);
  17. }
  18. }
  19. }
  20. return res;
  21. }
  22. vector<TreeNode*> generateTrees(int n) {
  23. if(!n) return {};
  24. return getTrees(1,n);
  25. }
  26. };