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

本文主要是介绍代码随想录算法训练营Day22|235. 二叉搜索树的最近公共祖先 ,701.二叉搜索树中的插入操作 ,450.删除二叉搜索树中的节点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

235. 二叉搜索树的最近公共祖先:代码随想录

这道题目的意思和前面的二叉树的最近公共祖先一样,只不过是换成了二叉搜索树,我采用的方法还是和普通二叉树一样,利用回溯的方法,来看具体代码的实现

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root==NULL) return NULL;if(root==p || root==q) return root;TreeNode* leftTree=lowestCommonAncestor(root->left,p,q);TreeNode* rightTree=lowestCommonAncestor(root->right,p,q);if(leftTree!=NULL && rightTree!=NULL) return root;if(leftTree==NULL && rightTree!=NULL) return rightTree;if(leftTree!=NULL && rightTree==NULL) return leftTree;return NULL;}
};

当结点为空时,说明没有找到目标的结点,返回空,当找到时,就返回当前节点,后序遍历,如果左右孩子都不为空,说明该结点就是祖先,返回即可。下面来看卡哥的代码

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

当结点为空时,返回空,当两个结点的值都小于时,往左孩子搜索,反之往右孩子搜索,其他情况就说明在该节点的左右两边。说明该节点就是祖先,返回即可

701.二叉搜索树中的插入操作:代码随想录

这道题就是让你在二叉搜索树中插入结点,很简单直接看代码

class Solution {
public:TreeNode* insertIntoBST(TreeNode* &root, int val) {if(root==NULL){root= new TreeNode(val);}else if(val<root->val){TreeNode* leftTree=insertIntoBST(root->left,val);}else if(val>root->val){TreeNode* rightTree=insertIntoBST(root->right,val);}return root;}
};

当到叶子结点时,就新建一个节点就可以了。

450.删除二叉搜索树中的节点:代码随想录

这道题就是让你删除一个节点,并且保证删除过后仍然是一个而二叉搜索树,这里要分情况讨论,先来看代码,这里我采用的方法是链接左子树的结点,而卡哥是连接右子树的结点,

class Solution {
public:TreeNode* deleteNode(TreeNode* &root, int key) {return Delete(root,key);}TreeNode* Delete(TreeNode* &root, int val){if(root==NULL) return NULL;if(root->val==val){if(root->left==NULL && root->right==NULL){return NULL;}if(root->left==NULL && root->right!=NULL){//TreeNode* p=root;return root->right;}if(root->left!=NULL && root->right==NULL){//TreeNode* p=root;return root->left;// delete p;}if(root->left!=NULL && root->right!=NULL){TreeNode* p=root->left;while(p->right!=NULL){p=p->right;}if(p==root->left){p->right=root->right;return root->left;}else{p->right=root->right;return root->left;}}}if(root->val>val){root->left = Delete(root->left,val);}if(root->val<val){root->right = Delete(root->right,val);}return root;}
};

首先当结点为空时,就直接返回空,如果该节点就是要删除的结点,并且他的左右孩子为空,那就直接返回空,注意这里的函数是有返回值的,会有上一层的结点的左右孩子来接收,如果是左孩子或者右孩子为空的情况,那就返回不是空的那个就可以了,如果是都不为空,那么就看左子树的离要删除的结点的数值最近的那个就是root结点的左孩子一直向右遍历的结点,让该节点的右孩子等于root的右孩子,然后返回root的left即可。

这篇关于代码随想录算法训练营Day22|235. 二叉搜索树的最近公共祖先 ,701.二叉搜索树中的插入操作 ,450.删除二叉搜索树中的节点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084954

相关文章

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定