代码随想录算法训练营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脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log