代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点

news2024/11/24 17:59:56

二叉搜索树的最近公共祖先

题目链接:力扣

 其实可以用之前普通二叉树最近公共祖先的算法。但是这样没有很好的利用二叉搜索树是有序的性质。

    TreeNode* lowestCommonAncestor1(TreeNode* root, TreeNode* p, TreeNode* q) {

        if(!root || root == p ||root==q) return root;

        TreeNode* left = lowestCommonAncestor1(root->left,p,q);
        TreeNode* right = lowestCommonAncestor1(root->right,p,q);

        if(left && right) return root;
        else if(!left && right) return right;
        else if(left && !right) return left;
        else return NULL;       
    }

因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。

那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是q 和 p的公共祖先,且一定是最近公共祖先!

  TreeNode* lowestCommonAncestor2(TreeNode* root, TreeNode* p, TreeNode* q)
    {
        if(!root) return NULL;
        
        if(root->val > p->val && root->val > q->val)
        {
           TreeNode* left = lowestCommonAncestor2(root->left,p,q);
            if(left != NULL) return left;
       } 

        if(root->val < p->val && root->val < q->val)
        {
            TreeNode*  right = lowestCommonAncestor2(root->right,p,q);
            if(right != NULL) return right;
        }
       return root;
    }

本题的迭代法版本如下所示,个人认为迭代法更好理解:

   TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
    {
        while(root)
        {
            if(root->val > p->val && root->val > q->val)
            root = root->left;
            else if (root->val < p->val && root->val < q->val)
            root = root->right;
            else
            return root;
        }
        return NULL;

    }

二叉搜索树中的插入操作 

题目链接:力扣

 递归法:

 TreeNode* insertIntoBST(TreeNode* root, int val)
    {      
       if(!root)
       {
           TreeNode* node = new TreeNode(val);
           return node; 
       }
       
       if(root->val > val)
         root->left = insertIntoBST(root->left, val);
       else if(root->val <val)
         root->right = insertIntoBST(root->right,val);
       return root;

    }

迭代:

  TreeNode* insertIntoBST1(TreeNode* root, int val) {

        TreeNode* cur = root;
        TreeNode* node = new TreeNode(val);
        if(!root) return node;

        TreeNode* temp = new TreeNode();
        while(cur)
        {
            if(cur->val < val)
            {
                 temp = cur;
                 cur  = cur->right;
            }
            else if(cur->val > val)
            {
                temp = cur;
                 cur  = cur->left;
            }

            if(!cur)
            {
                if(temp->val > val)
                temp->left = node;
                else
                temp->right = node;
                break;
            }
        }
        return root;
    }

 

删除二叉搜索树中的节点 

题目链接:力扣

删除二叉树的节点会遇到5种情况:
1、没找到要删的节点
2、删除的节点是叶子节点(左为空,右为空):直接置空
3、删除的节点左不空,右为空:让删除节点的父节点直接指向删除节点的左孩子 
4、删除的节点左为空,右不空:让删除节点的父节点直接指向删除节点的右孩子 
5、删除节点左不空,右不空:这种情况是最麻烦的。将删除节点的左子树放在删除节点的右子树的最左侧位置下方
例如删除7,则将7的左子树头节点5 放在 右子树最左侧节点8 的下面

 具体的递归版代码如下:

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(!root) return nullptr;  //没找到要删除的节点
        if(root->val == key)
        {
            if(!root->left && !root->right)
                 return nullptr;
            else if(root->left && !root->right)
                 return root->left;
            else if(!root->left && root->right)
                 return root->right;
            else
            {
                TreeNode* cur = root->right;
                while(cur->left) cur=cur->left;
                cur->left = root->left;
                return root->right;
            }
        }

        if(key<root->val)
           root->left = deleteNode(root->left,key);
        if(key>root->val)
           root->right = deleteNode(root->right,key);

        return root;
    }
};

 值得注意的是,这里的主递归函数体相当于把新的节点返回给上一层,上一层就要用 root->left 或者 root->right接住。

 

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

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

相关文章

嵌入式系统中重要的编程思想:分层与时间片

1. 分层思想 分层的思想&#xff0c;并不是什么神秘的东西&#xff0c;事实上很多做项目的工程师本身自己也会在用。分层结构确是很有用的东西&#xff0c;参透后会有一种恍然大悟的感觉。 如果说我不懂LCD怎么驱动&#xff0c;那好办&#xff0c;看一下datasheet&#xff0c…

Java技术规范概览

Java技术规范 目录概述需求&#xff1a; 设计思路实现思路分析1.Java JSR的部分2.JSR-000373.JSR-0000394.JSR-000337 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a bet…

三步快速激活chatGPT4

0、背景 Depay停止注册背景下&#xff0c;新用户如何开通chatGPT4&#x1f914;? 注意事项; 1.选在8:00-22:00之间阅读本教程&#x1f600;&#x1f601;&#x1f604; 2.本教程尝试过欧易和nodepay&#xff0c;但都不好用&#xff0c;故采用FOMEpay&#x1f60d;&#x1f60…

#Microsoft Edge功能测评!# 关于Edge浏览器以及插件推荐

关于Edge浏览器以及插件推荐 1.关于Microsoft Edge......1.1 什么是Microsoft Edge1.2Microsoft Edge的优势 2.Microsoft Edge的分屏功能2.1 如何分屏&#xff1f;2.2分屏的优势 3.Microsoft Edge插件推荐3.1 AIX智能下载器(图片/视频/音乐/文档)3.2 AdGuard 广告拦截器3.3 破解…

python基础知识(五):while循环、for循环、continue语句和break语句

目录 1. while循环2. for循环3. 循环语句和if语句结合3. continue语句4. break语句5. 双重循环6. 双重循环和continue语句以及break语句 1. while循环 while循环简单来说就是满足循环条件就执行循环语句&#xff0c;直到不满足为止&#xff0c;否则陷入死循环。 while语法 wh…

[架构之路-202]- 常见的需求获取技术=》输出=》用户需求、客户需求(As...., I want.....)、用例图

目录 前言&#xff1a; 11.2.1 直接的用户访谈 1 . 准备访谈 2 . 访谈过程 3 . 访谈的后续工作 4 . 用户访谈的优缺点 11.2.2 问卷调查 1 . 调查表的制作 2 . 问卷调查的优缺点 3 . 提高问卷返还率的方法 11.2.3 采样 1 . 样本大小 2 . 采样的优缺点 11.2.4 情节…

路径规划算法:基于生物地理学优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于生物地理学优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于生物地理学优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

上海亚商投顾:上证50创年内新低 电力、煤炭板块全天领跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日震荡调整&#xff0c;午后集体跌超1%&#xff0c;上证50一度跌近2%&#xff0c;尾盘跌幅有所收窄。芯…

MyBatis——动态SQL

经常遇到很多按照很多查询条件进行查询的情况&#xff0c;比如京东根据不同的条件筛选商品。其中经常出现很多条件不取值的情况&#xff0c;在后台应该如何完成最终的SQL语句呢&#xff1f; 如果采用JDBC进行处理&#xff0c;需要根据条件是否取值进行SQL语句的拼接&#xff0…

05 缓存预热+缓存雪崩+缓存击穿+缓存穿透

缓存血崩 发生 redis主机挂了&#xff0c;Redis 全盘崩溃比如缓存中有大量数据同时过期 解决 redis缓存集群实现高可用 主从哨兵Redis Cluster ehcache本地缓存 Hystrix或者阿里sentinel限流&降级开启Redis持久化机制aof/rdb&#xff0c;尽快恢复缓存集群 缓存穿透 是…

Gouraud Shading(高洛德着色法)和其优缺点详解

​ Gouraud是一种插值方法&#xff0c;Gouraud着色法是计算机图形学中的一种插值方法&#xff0c;可以为多边形网格表面生成连续的明暗变化。实际使用时&#xff0c;通常先计算三角形每个顶点的光照&#xff0c;再通过双线性插值计算三角形区域中其它像素的颜色。 在图形处理器…

Benewake(北醒) 快速实现TFLuna-IIC与电脑通信的操作说明

目录 1. 概述2. 测试准备2.1 工具准备 3. IIC通讯测试3.1 引脚说明3.2 测试步骤3.2.1 TFLuna-IIC 与 PC 建立连接3.2.2 获取测距值3.2.3 更改 slave 地址 1. 概述 通过本文档的概述&#xff0c;能够让初次使用测试者快速了解测试 IIC 通信协议需要的工具以及查看哪些对应的 II…

小程序容器助力构建新型超级App软件应用架构

所谓软件架构&#xff0c;就是软件系统的骨骼与框架。近年来&#xff0c;软件及开源技术迅猛发展&#xff0c;软件应用架构的概念也愈加普遍。它提供了一种组织和设计软件系统的有效方法&#xff0c;具有许多优势和好处&#xff1a; 模块化和可维护性&#xff1a;软件应用架构将…

Spring Boot 集成Kafka简单应用

说明&#xff1a;当前kafka的版本为2.13-2.8.1&#xff0c;Spring Boot的版本为2.7.6。 第一步&#xff1a;在pom.xml中引入下述依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><ver…

Android之解决RecyclerView与NestedScrollView的滑动冲突方法

1、解决RecyclerView与NestedScrollView的滑动冲突 问题一&#xff1a;当我们滑动RecyclerView组件时&#xff0c;上方的轮播图并没有进行滑动&#xff08;NestedScrollView没有滑动&#xff0c;即滑动事件被RecyclerView消费了&#xff09;&#xff0c;当RecyclerView滑到底时…

Nginx的搭建和优化

目录 一. Nginx简介1.1 概述1.2 Nginx和Apache优缺点比较 二. Nginx编译安装步骤1 关闭防火墙&#xff0c;安装依赖包2. 创建运行用户和组3. 编译安装 Nginx4. 做软连接并启动nginx5. 停止Nginx6. 添加nginx系统服务方法一&#xff1a;编写脚本方法二 将nginx命令加入服务 7. 查…

高完整性系统工程(四):Formal Verification and Validation

目录 1. Specification Process 1.1 State Invariants 1.2 Exceptional Behaviour 1.3 Framing 1.4 Summary 2. V&V FOR SPECS 2.1 V&V for formal specs 2.2 Proof 2.3 Proof Assistants 2.4 Model Checking 1. Specification Process Specification Proces…

1128 N Queens Puzzle(21行代码)

分数 20 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 The "eight queens puzzle" is the problem of placing eight chess queens on an 88 chessboard so that no two queens threaten each other. Thus, a solution requires that no two queens sha…

QTranslator Class

QTranslator Class QTranslator 类公共成员函数类说明查找翻译使用多种翻译成员函数使用说明 QTranslator 类 QTranslator类为文本输出提供国际化支持。多国语言 Header: #include <QTranslator> qmake: QT core Inherits: QObject公共成员函数 构造函数QTranslator(…

代码随想录算法训练营15期 Day 7 | 454.四数相加II 、 383. 赎金信 、15. 三数之和 、18. 四数之和

昨天看了一下别的东西&#xff0c;导致昨天没有练习打卡&#xff0c;今天补上昨天的学习知识。 454.四数相加II 建议&#xff1a;本题是 使用map 巧妙解决的问题&#xff0c;好好体会一下 哈希法 如何提高程序执行效率&#xff0c;降低时间复杂度&#xff0c;当然使用哈希法 会…