LeetCode二叉树经典题目(六):二叉搜索树

news2024/11/27 17:41:09

目录

28. LeetCode617. 合并二叉树

29. LeetCode700. 二叉搜索树中的搜索

30. LeetCode98. 验证二叉搜索树

31. LeetCode530. 二叉搜索树的最小绝对差

32. LeetCode501. 二叉搜索树中的众数

33. LeetCode236. 二叉树的最近公共祖先​


28. LeetCode617. 合并二叉树

递归:
class Solution {
public:
    TreeNode*traversal(TreeNode*node1,TreeNode*node2){
        //某一节点为空,直接把不为空的子树接到总树即可
        if(node1==NULL||node2==NULL){
            return node1?node1:node2;
        }
        TreeNode*root=new TreeNode(node1->val+node2->val);
        root->left=traversal(node1->left,node2->left);
        root->right=traversal(node1->right,node2->right);
        return root;
    }

    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1==NULL||root2==NULL){//如果有空树,返回不为空的
            return root1?root1:root2;
        }
        return traversal(root1,root2);
    }
};

迭代:队列层序遍历
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1==NULL||root2==NULL){
            return root1?root1:root2;
        }
        queue<TreeNode*>que;
        que.push(root1);
        que.push(root2);
        while(!que.empty()){
            TreeNode*node1=que.front();que.pop();//取root1节点
            TreeNode*node2=que.front();que.pop();//取root2节点
            
            node1->val+=node2->val;//node1和node2必不为空

            //加入子树
            if(node1->left&&node2->left){
                que.push(node1->left);
                que.push(node2->left);
            }
            if(node1->right&&node2->right){
                que.push(node1->right);
                que.push(node2->right);
            }
            
            //有一个为空,接入不为空的
            if(node1->left==NULL&&node2->left!=NULL){
                node1->left=node2->left;
            }
            if(node1->right==NULL&&node2->right!=NULL){
                node1->right=node2->right;
            }
        }
        return root1;
    }
};

29. LeetCode700. 二叉搜索树中的搜索

递归:
class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if(root==NULL)return NULL;
        if(val==root->val)return root;
        else if(val>root->val)return searchBST(root->right,val);
        else return searchBST(root->left,val);
    }
};

迭代:
class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        while(root!=NULL&&root->val!=val){
            if(val>root->val)root=root->right;
            else if(val<root->val)root=root->left;
        }
        return root;
    }
};

30. LeetCode98. 验证二叉搜索树

递归:
1.有序数组:
class Solution {
public:
    vector<int>vec;
    void traversal(TreeNode*node){
        if(node==NULL)return;
        traversal(node->left);
        vec.push_back(node->val);
        traversal(node->right);
    }
    bool isValidBST(TreeNode* root) {
        traversal(root);
        for(int i=0;i<vec.size()-1;i++){
            if(vec[i]>=vec[i+1])return false;
        }
        return true;
    }
};
2.双指针
class Solution {
public:
    TreeNode*pre=NULL;
    bool isValidBST(TreeNode* root) {
        if(root==NULL)return true;
        bool left=isValidBST(root->left);
        //由于中序遍历二叉搜索树,所以前一个节点的值必定小于当前节点的值
        if(pre!=NULL&&root->val<=pre->val)return false;
        pre=root;
        bool right=isValidBST(root->right);
        return left&&right;
    }
};

迭代:
class Solution {
public:
    bool isValidBST(TreeNode* root) {
        stack<TreeNode*>stk;
        TreeNode*cur=root;
        TreeNode*pre=NULL;
        while(cur!=NULL||!stk.empty()){//未遍历完或者未处理完都不可退出循环
            if(cur!=NULL){
                stk.push(cur);
                cur=cur->left;//左
            }else{
                cur=stk.top();//中
                stk.pop();
                if(pre!=NULL&&pre->val>=cur->val)return false;
                pre=cur;
                cur=cur->right;//右
            }
        }
        return true;
    }
};

31. LeetCode530. 二叉搜索树的最小绝对差

迭代:
有序数组
class Solution {
public:
    vector<int>vec;
    void traversal(TreeNode*node){
        if(node==NULL)return;
        traversal(node->left);
        vec.push_back(node->val);
        traversal(node->right);
    }
    int getMinimumDifference(TreeNode* root) {
        int minVal=INT_MAX;
        traversal(root);
        for(int i=0;i<vec.size()-1;i++){
            minVal=min(minVal,vec[i+1]-vec[i]);
        }
        return minVal;
    }
};

双指针:
class Solution {
public:
    int minVal=INT_MAX;
    TreeNode*pre=NULL;
    void traversal(TreeNode*node){
        if(node==NULL)return;
        traversal(node->left);
        if(pre!=NULL)minVal=min(minVal,node->val-pre->val);//差值最小必定相邻
        pre=node;
        traversal(node->right);
    }
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return minVal;
    }
};

迭代:
class Solution {
public:
    int getMinimumDifference(TreeNode* root) {
        stack<TreeNode*>stk;
        TreeNode*cur=root;
        TreeNode*pre=NULL;
        int minVal=INT_MAX;
        while(cur!=NULL||!stk.empty()){
            if(cur!=NULL){
                stk.push(cur);
                cur=cur->left;
            }else{
                cur=stk.top();
                stk.pop();
                if(pre!=NULL)minVal=min(minVal,cur->val-pre->val);
                pre=cur;
                cur=cur->right;
            }
        }
        return minVal;
    }
};

32. LeetCode501. 二叉搜索树中的众数

递归:
普通二叉树:
class Solution {
public:
    map<int,int>record;

    //比较器且必须是全局函数
    bool static cmp(const pair<int,int>&p1,const pair<int,int>&p2){
        return p1.second>p2.second;
    }

    //统计词频
    void traversal(TreeNode*node){
        if(node==NULL)return;
        record[node->val]++;
        traversal(node->left);
        traversal(node->right);
    }

    vector<int> findMode(TreeNode* root) {
        traversal(root);
        vector<pair<int,int>>vec(record.begin(),record.end());//录入数组
        sort(vec.begin(),vec.end(),cmp);
        vector<int>res;
        for(int i=0;i<vec.size();i++){
            if(vec[i].second==vec[0].second)res.push_back(vec[i].first);
            else break;
        }
        return res;
    }
};

搜索二叉树(双指针):
class Solution {
public:
    vector<int>res;
    TreeNode*pre=NULL;
    int maxCount=0;
    int count=0;
    void traversal(TreeNode*node){
        if(node==NULL)return;
        traversal(node->left);//左
        if(pre==NULL)count=1;//第一个节点
        else if(pre->val==node->val)count++;
        else count=1;
        //中
        if(count==maxCount)res.push_back(node->val);
        else if(count>maxCount){
            maxCount=count;
            res.clear();//之前加入结果集的众数无效,清空
            res.push_back(node->val);
        }
        pre=node;
        //右
        traversal(node->right);
    }
    vector<int> findMode(TreeNode* root) {
        traversal(root);
        return res;
    }
};

迭代:
class Solution {
public:
    vector<int> findMode(TreeNode* root) {
        stack<TreeNode*>stk;
        TreeNode*cur=root;
        TreeNode*pre=cur;
        int maxCount=0;
        int count=0;
        vector<int>res;
        while(cur!=NULL||!stk.empty()){
            if(cur!=NULL){
                stk.push(cur);
                cur=cur->left;
            }else{
                cur=stk.top();
                stk.pop();
                if(pre==NULL)count=1;
                else if(pre->val==cur->val)count++;
                else count=1;

                if(count==maxCount)res.push_back(cur->val);
                else if(count>maxCount){
                    maxCount=count;
                    res.clear();
                    res.push_back(cur->val);
                }
                
                pre=cur;
                cur=cur->right;
            }
        }
        return res;
    }
};

33. LeetCode236. 二叉树的最近公共祖先

普通版:
class Solution {
public:
    map<TreeNode*,TreeNode*>fatherMap;

    //完善父节点表
    void traversal(TreeNode*node){
        if(node==NULL)return;
        fatherMap[node->left]=node;
        fatherMap[node->right]=node;
        traversal(node->left);
        traversal(node->right);
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        fatherMap[root]=root;
        traversal(root);
        set<TreeNode*>pAncestor;//记录p的所有祖先
        while(fatherMap[p]!=p){//先加入自己,因为p有可能是q的祖先
            pAncestor.insert(p);
            p=fatherMap[p];
        }
        while(fatherMap[q]!=q){
            if(pAncestor.count(q)!=0)return q;
            q=fatherMap[q];
        }
        return q;
    }
};

优化版:后序遍历最合适
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==p||root==q||root==NULL)return root;
        TreeNode*left=lowestCommonAncestor(root->left,p,q);//左
        TreeNode*right=lowestCommonAncestor(root->right,p,q);//右
        if(left!=NULL&&right!=NULL)return root;//中
        return left?left:right;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hi3861鸿蒙物联网项目实战:智能安防报警

华清远见FS-Hi3861开发套件&#xff0c;支持HarmonyOS 3.0系统。开发板主控Hi3861芯片内置WiFi功能&#xff0c;开发板板载资源丰富&#xff0c;包括传感器、执行器、NFC、显示屏等&#xff0c;同时还配套丰富的拓展模块。开发板配套丰富的学习资料&#xff0c;包括全套开发教程…

Windows11 系统打开IE浏览器的方式(完整版)

前言 大家好&#xff0c;好久不见&#xff01; 1、最近疯狂加班&#xff0c;旧电脑不太给力&#xff0c;换了新电脑&#xff0c;嘎嘎开心&#xff1b;开心之余发现新电脑是Win11系统的&#xff0c;但是IE浏览器找不到了&#xff0c;由于我的某些工作需要用到IE浏览器&#xf…

Vue2前端路由(vue-router的使用)、动态路由、路由和视图的命名以及声明式和编程式导航

目录 一、vue2的前端路由&#xff08;vue-router&#xff09; 1、路由&#xff1a;页面地址与组件之间的对应关系 2、路由方式&#xff1a;服务器端路由、前端路由 3、前端路由&#xff1a;在前端维护一组路由规则&#xff08;地址和组件之间的对应关系&#xff09;&#xf…

【UE4 第一人称射击游戏】34-制作一个简易计时器

上一篇&#xff1a;【UE4 第一人称射击游戏】33-创建一个迷你地图本篇效果&#xff1a;可以看到左上角有个简易的关卡计时器在倒计时步骤&#xff1a;打开“FPSHUD”&#xff0c;拖入一个图像控件图像选择“Timer_Backing”&#xff0c;尺寸改为4719拖入3个文本控件大小为1210字…

学习ffmpeg-录屏实现记录

项目需要一个录屏的功能&#xff0c;之前看到了一个使用Qt计时器截图avilib生成AVIffmpeg合并视频音频的方式&#xff1a;Qt C 录屏录音功能实现&#xff08;avilibffmpeg&#xff09;以及动态库生成https://blog.csdn.net/qq_35769071/article/details/125323624使用后&#x…

【.dll 没有被指定在windows上运行】

修复&#xff08;重新注册DLL&#xff09;的具体步骤如下&#xff1a; 方法一&#xff1a; 1、快捷键winr打开“运行”输入cmd,点击确定打开命令提示符窗口。 2、复制&#xff1a;for %1 in (%windir%\system32*.dll) do regsvr32.exe /s %1 命令&#xff0c;在打开的管理员…

ubuntu安装vue

首先建议使用ubuntu18.04以上的系统&#xff0c;不然会有类似fcntlGLIBC_2.28‘未定义的引用的报错 VUE官网&#xff1a;http://caibaojian.com/vue/guide/installation.html 其中安装说明只写到&#xff1a;npm install vue 我们还需要安装node.js、npm 1、安装 NVM&#xf…

Windows安装TensorRT

文章目录前言TensorRT下载TensorRT安装参考资料前言 本文将介绍Windows如何安装TensorRT。本文的基础是&#xff1a;Windows安装PytorchCUDA环境 TensorRT下载 进入官方网站&#xff1a;https://developer.nvidia.com/nvidia-tensorrt-8x-download 寻找自己对应的版本&#…

RabbitMQ之Work Queue(工作队列)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;曾经在某央企公司实习&#xff0c;目前在某税务公司。本篇文章将记录和分享RabbitMQ工作队列相关的知识点。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适合复习中&am…

【自学Python】Python string转bytes

Python string转bytes Python string转bytes教程 在 Python 中&#xff0c;bytes 类型和 字符串 的所有操作、使用和内置方法也都基本一致。因此&#xff0c;我们也可以实现将字符串类型转换成 bytes 类型。 Python string转bytes方法 如果字符串内容都是 ASCII 字符&#…

从0到1完成一个Vue后台管理项目(十六、后端分页方法以及分页组件的封装以及复用)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

C++STL——list类与模拟实现

Listlistlist的常用接口模拟实现完整代码list与vector的区别list list是一个带头双向循环链表。 list文档介绍&#xff1a;https://legacy.cplusplus.com/reference/list/list/ list因为是链表结构&#xff0c;所以没有 [] 去访问数据的方式&#xff0c;只有用迭代器&#xff…

第十六届中国大数据技术大会五大分论坛顺利举办!

1月8日下午&#xff0c;由苏州市人民政府指导、中国计算机学会主办、苏州市吴江区人民政府支持&#xff0c;CCF大数据专家委员会、苏州市吴江区工信局、吴江区东太湖度假区管委会、苏州市吴江区科技局、苏州大学未来科学与工程学院及DataFounain数联众创联合承办的第十六届中国…

基于java springboot+mybatis学生学科竞赛管理管理系统设计和实现

基于java springbootmybatis学生学科竞赛管理管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言…

10.Isaac教程--在Docker中通过模拟训练目标检测

在Docker中通过模拟训练目标检测 文章目录在Docker中通过模拟训练目标检测怎么运行的主机设置硬件要求软件要求NGC Docker 注册表设置第一次运行数据集生成配置您的工作区Jupyter 变量设置开始训练添加您自己的 3D 模型故障排除接下来人工智能中的一个常见问题是训练样本的数据…

02【Http、Request】

文章目录02【Http、Request】一、HTTP协议1.1 HTTP协议概述1.1.1 HTTP协议的概念1.1.2 HTTP协议的特点&#xff1a;2.1 HTTP请求的组成2.1.1 请求行2.1.2 请求头2.1.3 请求体二、HttpServletRequest对象2.1 HttpServletRequest对象简介2.2 HttpServletRequest的使用2.2.1 请求行…

Redis未授权访问漏洞(三)Redis写入反弹连接定时任务

前言 系列文章 Redis未授权访问漏洞(一)先导篇 Redis未授权访问漏洞(二)Webshell提权篇 Redis写入反弹连接任务 环境准备 攻击机&#xff1a; Centos7 IP:192.168.142.44 靶机&#xff1a;Centos7 IP:192.168.142.66 我们先来回顾一下corntab定时任务的一些基本命令&#xf…

python数据分析及可视化(二十)Power BI的可视化制作以及A股上市公司数据分析

可视化制作 通过图表展示如何用Power BI 制作可视化的图表&#xff0c;来展示可视的数据内容。 柱形图 用水平的柱子来表示不同分类数据的大小&#xff0c;类似于条形图&#xff0c;相当于竖着的条形图。堆积柱形图是不同的序列数据都堆积在一个柱子上&#xff0c;簇状柱形图…

【Spring源码】20. MergedBeanDefinitionPostProcessor修改/合并bean定义

随后进入applyMergedBeanDefinitionPostProcessors()方法applyMergedBeanDefinitionPostProcessors()方法中调用MergedBeanDefinitionPostProcessor后置处理器修改/合并bean定义 进入bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName) 从源码中可以看到&#xff0…

Spring为什么这么火 之 Spring蕴含的设计思想

目录 1、什么是IoC&#xff1f; 2、传统程序开发 3、控制反转式程序开发 4、理解Spring IoC 5、依赖注入【DI】 前言 很多人说&#xff1a;“Java程序员都是Spring程序员”&#xff0c;从这句话就能看出&#xff0c;对于Java程序员来说&#xff0c;Spring是一项必备技能&am…