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

二叉树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的右孩子作为新rootdelete 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.hqwc.cn/news/319761.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】编程世界的不朽基石与未来展望

C语言&#xff0c;一种经久不衰的高级编程语言&#xff0c;自1972年由Dennis Ritchie在AT&T贝尔实验室开发以来&#xff0c;已深深扎根于编程语言的发展历程中。它既是计算机科学史上的一个重要里程碑&#xff0c;也是现代软件开发的核心支柱。从操作系统到嵌入式系统的构建…

[C#]C# OpenVINO部署yolov8实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 抛弃了前几代模型的 Anchor-Base。 YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Ali Farhadi 等人提出初代模型以来&#xff0c;领域内的研究者们…

【Adobe Acrobat DC】弹窗:正在准备文档以供阅读,请稍候

问题描述 Acrobat打开PDF就会有这个弹窗&#xff0c;要所有扫一遍才能看&#xff0c;要等特别久 解决办法1 参考这篇博客评论区里给出的方法 1. 转到“编辑”>“首选项”>“朗读”。 2. 在“屏幕阅读器选项”下面&#xff0c;选择“仅阅读当前可见页面”。 再次打开…

程序员必知!享元模式的实战应用与案例分析

享元模式是一种减少相似对象创建和销毁的设计模式&#xff0c;通过将对象状态分为不变和可变部分&#xff0c;实现内存节省和性能提升。例如&#xff0c;在线游戏中大量玩家角色可共享相同的不变属性&#xff0c;而每人特有的可变属性则单独存储&#xff0c;享元模式使用享元类…

微信小程序-页面开发

文章目录 微信小程序第二章2. 页面开发2.1 创建开发页面2.2 修改项目首页2.3 页面的结构和样式设计2.3.1 WXML结构设计2.3.1.1 什么是WXML2.3.1.2 WXML的常见标签2.3.1.3 WXML的特点 2.3.2 WXSS样式设计2.3.2.1 什么是WXSS 2.4 组件库的使用和自定义组件2.4.1 小程序中的组件分…

企业特别大的文件用什么传输比较快?

在企业日常运营中&#xff0c;经常需要传输大文件&#xff0c;比如营销资料、设计图纸、视频素材等等&#xff0c;这些文件不仅大小可能达到几个GB甚至几个TB&#xff0c;而且往往需要跨越地域和网络环境进行传输&#xff0c;这就给企业带来了很大的挑战。 在企业内部&#xff…

高级感满满的视频监控技术?看完这骚操作,我震惊了!

随着科技的不断进步&#xff0c;视频监控系统在各个领域得到了广泛的应用。无论是保障公共安全、管理商业场所&#xff0c;还是监控生产流程&#xff0c;视频监控系统为我们提供了全面、实时的信息。 客户案例 零售业 在零售业中&#xff0c;实时监控对于防范盗窃、提升店内安…

whl is not a supported wheel on this platform.解决办法

1.问题&#xff1a; 安装torch产生 2.解决办法&#xff1a; 使用pip debug --verbose查看 对应的torch版本号 Compatible tags字样&#xff0c;这些就是当前Python版本可以适配的标签。例如&#xff0c;我的Python版本是3.11&#xff0c;可以匹配下面这些文件名&#xff1a;…

使用IDEA创建使用 JDK8 的 2.x.x 版本的 Spring Boot 项目以及 Spring Boot 项目如何修改JDK版本

目录 一、在阿里云上官网上创建项目 二、将 IDEA 中创建项目的源地址修改为阿里云官网 三、创建 3.x.x 的项目之后修改配置降低至 2.7.x 版本和使用 JDK8&#xff08;修改 Spring Boot 的 JDK 版本同理&#xff09; 从上面的 Spring Boot 官网的截图中可以发现&#xff0c;自…

【教学类-43-15】 20240103 (5宫格数独:内存数据不够计算) 不重复的基础模板数量:未知

背景需求&#xff1a; 测试5宫格有多少种不重复的基础模板&#xff08;只测试所有的25数字一组有多少个&#xff09; # 测试11*11格&#xff0c;2*2一共4套3*3 宫格目的&#xff1a;数独14 5宫格有不同的基础模板 作者&#xff1a;阿夏 时间&#xff1a;2024年01月04日 13:…

CSS免费在线字体格式转换器 CSS @font-face 生成器

今天竟意外发现的一款免费的“网页字体生成器”&#xff0c;功能强大又好用~ 工具地址&#xff1a;https://transfonter.org/ 根据你设置生成后的文件预览&#xff1a; 支持TTF、OTF、WOFF、WOFF2 或 SVG字体格式转换生成&#xff0c;每个文件最大15MB。转换完成以后还会生成一…

冠珠瓷砖携手时尚COSMOPOLITAN 对话时尚先锋,大美造境迭代筑家美学

冠珠瓷砖的三十年&#xff0c;是致力迭代中国人居大美的三十年&#xff1b;时尚COSMO的三十年&#xff0c;是探索女性美好生活的三十年&#xff1b;大美筑家先驱者遇上时尚美学潮流领航者&#xff0c;以一场充满美学张力的时尚跨界&#xff0c;献礼大美人居生活&#xff0c;致敬…