Day22 二叉树part08 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

news2024/11/26 19:45:20

二叉树part08 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

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

方法一:递归法(利用二叉搜索树性质)

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==nullptr) return root;
        if(root->val > p->val && root->val >q->val) //左
        {
            TreeNode* left = lowestCommonAncestor(root->left,p,q);
            return left;
        }
        if(root->val < p->val && root->val < q->val) //右
        {
            TreeNode* right = lowestCommonAncestor(root->right,p,q);
            return right;
        }
        return root;
    }
};

方法二:迭代法(利用二叉搜索树性质)

class Solution {
public:
    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 root;
    }
};

701. 二叉搜索树中的插入操作

方法一:递归找叶子节点

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root==nullptr) {
            TreeNode* root = new TreeNode(val);
            return root; //找到叶节点,传给上一层递归
        }
        if(val < root->val) root->left = insertIntoBST(root->left,val); //向左遍历,接收叶子节点的数值
        else root->right = insertIntoBST(root->right,val);
        return root;
    }
};

方法二:递归找叶子节点,但通过全局变量记录parent位置

class Solution {
public:
    TreeNode* parent; //插入位置的父节点
    void traversal(TreeNode* cur, int val)
    {
        if(cur==nullptr) {
            if(parent->val>val) parent->left = new TreeNode(val);
            else parent->right  = new TreeNode(val);
            return;
        }
        parent = cur; //进入上一层前,提前保存叶子结点的父节点
        if(cur->val>val) traversal(cur->left,val);
        else traversal(cur->right,val);
        return;
    }
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root==nullptr) { //根节点为null的特殊处理
            root = new TreeNode(val);
            return root;
        }
        traversal(root, val);
        return root;
    }
};

方法三:迭代法

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if (root == NULL) { //处理root为零特殊情况
            TreeNode* node = new TreeNode(val);
            return node;
        }
        TreeNode* cur = root;
        TreeNode* parent; // 这个很重要,需要记录上一个节点,否则无法赋值新节点
        while (cur != NULL) {
            parent = cur;
            if (cur->val > val) cur = cur->left;
            else cur = cur->right;
        }
        //找到parent位置了,接下来对parent的值和val对比,确定放在左节点还是右节点
        TreeNode* node = new TreeNode(val);
        if (val < parent->val) parent->left = node;// 此时是用parent节点的进行赋值
        else parent->right = node;
        return root;
    }
};

450. 删除二叉搜索树中的节点

有以下五种情况:

  • 第一种情况:没找到删除的节点,遍历到空节点直接返回了
  • 找到删除的节点
    • 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
    • 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
    • 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
    • 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

第五种情况有点难以理解,看下面动画:

450.删除二叉搜索树中的节点

动画中的二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。

将删除节点(元素7)的左孩子放到删除节点(元素7)的右子树的最左面节点(元素8)的左孩子上,就是把5为根节点的子树移到了8的左孩子的位置。

要删除的节点(元素7)的右孩子(元素9)为新的根节点。.

这样就完成删除元素7的逻辑,最好动手画一个图,尝试删除一个节点试试。

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if (root == nullptr) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了
        if (root->val == key) {
            // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
            if (root->left == nullptr && root->right == nullptr) {
                ///! 内存释放
                delete root;
                return nullptr;
            }
            // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
            else if (root->left == nullptr) {
                auto retNode = root->right;
                ///! 内存释放
                delete root;
                return retNode;
            }
            // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
            else if (root->right == nullptr) {
                auto retNode = root->left;
                ///! 内存释放
                delete root;
                return retNode;
            }
            // 第五种情况:左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置
            // 并返回删除节点右孩子为新的根节点。
            else {
                TreeNode* cur = root->right; // 找右子树最左面的节点
                while(cur->left != nullptr) {
                    cur = cur->left;
                }
                cur->left = root->left; // 把要删除的节点(root)左子树放在cur的左孩子的位置
                TreeNode* tmp = root;   // 把root节点保存一下,下面来删除
                root = root->right;     // 返回旧root的右孩子作为新root
                delete tmp;             // 释放节点内存(这里不写也可以,但C++最好手动释放一下吧)
                return root;
            }
        }
        if (root->val > key) root->left = deleteNode(root->left, key);
        if (root->val < key) root->right = deleteNode(root->right, key);
        return root;
    }
};

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

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

相关文章

74HC595驱动数码管程序

数码管的驱动分静态扫描和动态扫描两种&#xff0c;使用最多的是动态扫描&#xff0c;优点是使用较少的MCU的IO口就能驱动较多位数的数码管。数码管动态扫描驱动电路很多&#xff0c;其中最常见的是74HC164驱动数码管&#xff0c;这种电路一般用三极管作位选信号&#xff0c;用…

管理组件状态

概述 在应用中&#xff0c;界面通常都是动态的。如图1所示&#xff0c;在子目标列表中&#xff0c;当用户点击目标一&#xff0c;目标一会呈现展开状态&#xff0c;再次点击目标一&#xff0c;目标一呈现收起状态。界面会根据不同的状态展示不一样的效果。 图1 展开/收起目标…

50、实战 - 利用 conv + bn + relu + add 写一个残差结构

上一节介绍了残差结构&#xff0c;还不清楚的同学可以返回上一节继续阅读。 到了这里&#xff0c;一个残差结构需要的算法基本都介绍完了&#xff0c;至少在 Resnet 这种神经网络中的残差结构是这样的。 本节我们做一个实战&#xff0c;基于之前几节中手写的 conv / bn 算法&…

python封装接口自动化测试套件 !

在Python中&#xff0c;我们可以使用requests库来实现接口自动化测试&#xff0c;并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例&#xff1a; 首先&#xff0c;我们需要安装所需的库&#xff1a; pip install requests …

ssm基于web的志愿者管理系统的设计与实现+vue论文

摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的志愿者…

大数据毕业设计:旅游景点数据爬虫大屏实时监控系统✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

山海鲸可视化软件的优势:数据整合、可视化与个性化定制

随着科技的快速发展&#xff0c;企业数字化转型已成为必然趋势。而对于一些本身没有开发优势或非技术型企业&#xff0c;数字化产品的选择就成为重中之重。作为山海鲸可视化软件的开发者&#xff0c;我们深知这一点&#xff0c;对于企业来说&#xff0c;能选择一个产品一定要有…

电脑软件:CoolUtils Total Excel Converter:解决Excel格式转换难题,提升办公效率

大家在日常办公当中经常会遇到需要把Excel转换为其他文档格式的场景。今天小编给大家介绍一款强大的文件转换工具——Total Excel Converter&#xff0c;有了它&#xff0c;再也不会因为Excel文档格式转换的问题而烦恼了。 一、软件简介 CoolUtils Total Excel Converter官方版…

钡铼工控机BL302+PLC,助力酿酒业转型升级

啤酒是人类非常古老的酒精饮料&#xff0c;是水和茶之后世界上消耗量排名第三的饮料。 啤酒在生产过程中主要有制造麦芽、粉碎原料、糖化、发酵、贮酒後熟、过滤、灌装包装等工序流程。需要用到风选机、筛分机、糖化锅、发酵设备、过滤机、灌装机、包装机等食品机械设备。这些食…

Apache HTTPD 多后缀解析漏洞详解

Apache HTTPD 多后缀解析漏洞 1.查看python版本 这里python版本很重要&#xff0c;因为版本过低可能会导致后面的结果运行不成功 这里我就遇到了因为版本过低而执行不了docker-compose up -d的情况 查看python版本 cd /usr/bin ls -al python* 当版本过低时安装高版本的 …

云计算:OpenStack 分布式架构管理FLAT网络(单控制节点与多计算节点)

目录 一、实验 1.环境 2.控制节点创建网络 3.控制节点创建规格 4.控制节点新增安全组入口规则 5.控制节点创建实例 二、问题 1.FLAT网络底层如何实现 2.无法SSH 云主机实例 一、实验 1.环境 (1) 主机 表1 主机 主机架构IP备注controller控制节点192.168.204.210已部…

分布式系统架构设计之分布式事务的解决方案

针对以上分布式事务的挑战&#xff0c;现在业界也是有着对应的解决方案的&#xff0c;至于选择哪一种或者组合策略&#xff0c;需要架构师根据自己的实际系统和业务场景来进行决策。 1、两段式提交&#xff08;2PC&#xff09; 分布式事务的两段式提交&#xff08;2PC&#x…

机器学习(四) -- 模型评估(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…

阿里云PolarDB数据库不同配置租用价格表

阿里云数据库PolarDB租用价格表&#xff0c;云数据库PolarDB MySQL版2核4GB&#xff08;通用&#xff09;、2个节点、60 GB存储空间55元5天&#xff0c;云数据库 PolarDB 分布式版标准版2核16G&#xff08;通用&#xff09;57.6元3天&#xff0c;阿里云百科aliyunbaike.com分享…

全国计算机等级考试| 二级Python | 真题及解析(12)

一、选择题 1.在编写python程序时缩进的作用是()。 A.让程序更美观 B.只在for循环中使用 C.只在if语句中使用 D.用来界定代码块 2.已知列表list1=[8,22,34,9,…

【番外】【Airsim in Windows ROS in WSL2-Ubuntu20.04】环境配置大全

【番外】【Airsim in Windows &ROS in WSL2-Ubuntu20.04】环境配置大全 【前言&#xff08;可省略不看&#xff09;】1.在windows上面部署好UE4AirSim联合仿真环境2.在windows上面部署wsl2系统以及在wsl2上面部署ubuntu系统3.安装好ubuntu系统之后&#xff0c;目前只能在命…

代码随想录-刷题第四十六天

70. 爬楼梯&#xff08;进阶&#xff09; 题目链接&#xff1a;70. 爬楼梯 改为&#xff1a;一步一个台阶&#xff0c;两个台阶&#xff0c;三个台阶&#xff0c;…&#xff0c;直到 m 个台阶。问有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&#xff1a;本题是一个斐波…

国民技术与stm32 ADC采集

一、国民技术芯片ADC采集配置 /* PA1 ADC1_IN2 默认功能 DMA 通道1由ADC1触发 外部晶振16 系统时钟144M AHB 2分频 HCLK72M HCLK 经APB1 4分频 pclk1 18MHCLK/4 HCLK 经APB2 4分频 pclk2 18MHCLK/4ADCCLK不得超过14M*/ void DMA_ADC_Config(void) {ADC_InitType ADC_In…

Unity报错:InvalidOperationException: Insecure connection not allowed的解决方法

问题描述 在导入Steam VR 插件后报错&#xff1a; InvalidOperationException: Insecure connection not allowed UnityEngine.Networking.UnityWebRequest.SendWebRequest () (at <4139bb31c03640e7b650db6ec39d5754>:0) UnityEngine.WWW..ctor (System.String url) (…

大模型上下文长度的超强扩展:从LongLora到LongQLora

前言 本文一开始是《七月论文审稿GPT第2版&#xff1a;从Meta Nougat、GPT4审稿到Mistral、LongLora Llama》中4.3节的内容&#xff0c;但考虑到 一方面&#xff0c;LongLora的实用性较高二方面&#xff0c;为了把LongLora和LongQLora更好的写清楚&#xff0c;而不至于受篇幅…