代码随想录算法训练营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

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文