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

提示:

0 <= n <= 8

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

C++

/**
 * 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) {}
 * };
 */
 /*
 思路,对于[1,n],以m为根节点的树。左子树是[1,m-1]可构成的子树,右子树是[m+1,n]可构成的子树
 递归
 递归停止过条件:左边界大于有边界
 返回什么:所有可能树的根节点列表
 本级干什么:申请新节点,生成左子树可能列表。生成右子树可能列表,左右子树拼接。
 */
class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {   
        vector<TreeNode*> res;
        if(n)  return  recu(1,n);
        res.push_back(nullptr);
        return res;
    }
    vector<TreeNode*> recu(int l,int r){
    
        vector<TreeNode*> res;
        if(l>r)  {
            res.push_back(nullptr);
            return res;
        }
        
        for(int i=l;i<=r;i++)
              {
                  
                  vector<TreeNode*> left=recu(l,i-1);
                  vector<TreeNode*>  right=recu(i+1,r);
                  for(TreeNode * m:left)
                    for(TreeNode * n:right)
                        {   TreeNode* root=new TreeNode(i);
                            root->left=m;
                            root->right=n;
                            res.push_back(root);
                        }
                  

              }
              return res;
    }

};

相近题目:96.不同的二叉搜索树

上一篇:ADA 95教程 前言


下一篇:二手平台淘的明星同款穿搭?上95分看看