首页 > 其他分享 >LeetCode——95. 不同的二叉搜索树 II

LeetCode——95. 不同的二叉搜索树 II

时间:2023-10-05 23:33:20浏览次数:38  
标签:right TreeNode int 二叉 II 搜索 95 LeetCode left

本次博客,我将记录leetcode95,不同的二叉搜索树

95. 不同的二叉搜索树 II

image

本题要求我们从1~n构造不同的二叉搜索树

因为好久不碰数据结构了,导致对二叉搜索树的概念十分模糊

以下是一些概念:

二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。
性质如下:
1.非空左子树的所有键值小于其根结点的键值。
2.非空右子树的所有键值大于其根结点的键值。
3.左、右子树都是二叉搜索树。

本题关键点在于构造出所有不同的二叉搜索树,因此对于当前节点i,我们可以将其一分为二,即1~i-1i+1~n两部分,这两部分分别作为当前i节点的左子树和右子树

我们只需对每个i分别构造出其左子树和右子树,然后再将其拼接到当前节点的leftright子节点

代码如下:

/**
 * 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*> dfs(int x, int n){
        if(x>n){
            return {nullptr};
        }
        vector<TreeNode*> res;
        for(int i=x;i<=n;i++){
            vector<TreeNode*> ltree = dfs(x, i-1);
            vector<TreeNode*> rtree = dfs(i+1, n);
            for(auto& left:ltree){
                for(auto& right:rtree){
                    TreeNode* currTree = new TreeNode(i);
                    currTree->left = left;
                    currTree->right = right;
                    res.push_back(currTree);
                }
            }
        }
        return res;
    }
    vector<TreeNode*> generateTrees(int n) {
        return dfs(1, n);
    }
};

标签:right,TreeNode,int,二叉,II,搜索,95,LeetCode,left
From: https://www.cnblogs.com/Sky6634/p/17744110.html

相关文章

  • 【二分】P7795 [COCI2014-2015#7] PROSJEK 题解
    P7795典。显然\(\mathcal{O}(n^2)\)的时间复杂度无法通过。使子段平均值最大,考虑二分。可以二分平均值\(mid\),然后判断是否有满足条件的子段.时间复杂度:\(\mathcal{O}(\dfrac{n\log\max\{a_i\}}{\text{eps}})\),其中\(\text{eps}\)为设置的精度,\(\max\{a_i\}\leq10......
  • 2023 ICPC 网络预选赛补题 II
    2023ICPC网络预选赛II赛时AC题目M. DirtyWork点击查看代码#include<bits/stdc++.h>#definelddoubleusingnamespacestd;constintmaxn=1e6+5;inta[maxn],b[maxn];ldp[maxn],c[maxn];intt,n;boolcmp(lda,ldb){ returna<b;}intmain(){ scanf(&quo......
  • 题解 P9695【[GDCPC2023] Traveling in Cells】
    显然,询问的答案即为\(x\)所在的极长的满足颜色均在\(\mathbb{A}\)内的连续段的权值和。如果我们能维护对颜色的单点修改,以及求出某个位置所在极长连续段的左右端点\(l,r\),只需要树状数组即可求出答案。一个朴素的想法是对每种颜色开一棵线段树,单点修改是平凡的,极长连续段左......
  • LeetCode 26 删除有序数组中的重复项
    LeetCode26删除有序数组中的重复项1.题目地址https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/?envType=study-plan-v2&envId=top-interview-1502.题解这道题由于要删除的是重复出现的元素,并且给定数组是单调递增的。那么我们......
  • LeetCode 27 移除元素
    LeetCode27移除元素1.题目地址https://leetcode.cn/problems/remove-element/description/?envType=study-plan-v2&envId=top-interview-1502.题解这道题主要采用的是快慢指针的思想。具体操作如下:1.定义快慢指针:low和fast。2.首先,快慢指针均指......
  • LeetCode 88 合并两个有序数组
    LeetCode88合并两个有序数组1.题目地址https://leetcode.cn/problems/merge-sorted-array/description/?envType=study-plan-v2&envId=top-interview-1502.题解这道题跟归并排序的归并操作非常类似。(具体内容可以查看我的博客,这里不再赘述。)但是有一个需要注意......
  • 解决警告UserWarning: Glyph 38388 (\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from
    这个警告是由于在绘图时使用了当前字体不支持的字符,通常出现在使用非英文字符(比如中文、日文等)时。为了解决这个问题,你可以尝试以下几种方法:方法一:选择支持中文的字体在绘图之前,指定一个支持中文的字体。例如,可以使用matplotlib.rcParams来指定字体,示例如下:importmatplotlib.pyplo......
  • 数字信号处理-IIR滤波器
    1.IIR滤波器的设计步骤首先设计满足技术指标的模拟滤波器将模拟滤波器转换为数字滤波器2.如何设计模拟滤波器将任意的模拟滤波器指标转换为低通的模拟滤波器指标设计好低通滤波器(关键步骤)通过变换,将低通滤波器转换成任意的模拟滤波器低通模拟滤波器有三个模板:BW、CB、C......
  • 关于 VMware 虚拟机中的 SVGA II 虚拟设备
    VMwareSVGAII是VMware虚拟机中用于图形显示的虚拟显卡设备的一种。它是一种虚拟设备,专门为在虚拟机环境中提供图形支持而设计的。VMwareSVGAII虚拟设备的作用是模拟物理计算机上的图形适配器,允许虚拟机实例在虚拟化的环境中进行图形处理和显示。在本文中,我将详细解释VMwar......
  • LeetCode 周赛上分之旅 #49 再探内向基环树
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......