算法训练营 day22 二叉树 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树中的节点

news/2023/5/28 7:49:08

算法训练营 day22 二叉树 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树中的节点

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

235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。

递归法

  • 确定递归函数返回值以及参数

    参数就是当前节点,以及两个结点 p、q。

    返回值是要返回最近公共祖先,所以是TreeNode 。

  • 确定终止条件

    遇到空返回就可以了

  • 确定单层递归的逻辑

    在遍历二叉搜索树的时候就是寻找区间[p.val, q.val](注意这里是左闭又闭)

    那么如果 cur.val 大于 p.val,同时 cur.val 大于q.val,那么就应该向左遍历(说明目标区间在左子树上)。

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null) return null;if (root.val > p.val && root.val > q.val) {TreeNode left = lowestCommonAncestor(root.left, p, q);if (left!=null) return left;}if (root.val < p.val && root.val < q.val) {TreeNode right = lowestCommonAncestor(root.right, p, q);if (right!=null) return right;}return root;}
}//精简
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left,p,q);if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right,p,q);return root;}
}

迭代法

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {while (true){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 break;}return root;}
}

二叉搜索树中的插入操作

701. 二叉搜索树中的插入操作 - 力扣(LeetCode)

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

如下演示视频中可以看出:只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。

在这里插入图片描述

递归法

class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {if (root == null) // 如果当前节点为空,也就意味着val找到了合适的位置,此时创建节点直接返回。return new TreeNode(val);if (root.val < val){root.right = insertIntoBST(root.right, val); // 递归创建右子树}else if (root.val > val){root.left = insertIntoBST(root.left, val); // 递归创建左子树}return root;}
}

迭代法

class Solution {public static TreeNode insertIntoBST(TreeNode root, int val) {if (root == null) return new TreeNode(val);TreeNode result = root;TreeNode pre=null;while (root != null) {pre = root;//保存前一个节点if (root.val < val) root = root.right;else if (root.val > val) root = root.left;}if (root==null){if (pre.val > val) {pre.left = new TreeNode(val);} else {pre.right = new TreeNode(val);}}return result;}
}

删除二叉搜索树中的节点

450. 删除二叉搜索树中的节点 - 力扣(LeetCode)

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;
如果找到了,删除它。

这里就把二叉搜索树中删除节点遇到的情况都搞清楚。

有以下五种情况:

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

在这里插入图片描述

递归法

class Solution {public TreeNode deleteNode(TreeNode root, int key) {//第一种情况没有找到目标值if (root==null) return null;if (root.val==key){//第二种情况目标值为叶子节点if (root.left==null&&root.right==null){return null;}//第三种情况目标值左为空 右不为空else if (root.left!=null&&root.right==null){return root.left;}//第四种情况目标值右为空 左不为空else if (root.right!=null&&root.right==null){return root.right;}//第五种情况目标值左右都不为空else {TreeNode cur = root.right;while (cur.left!=null) cur = cur.left;cur.left = root.left;return root.right;}}if (root.val>key) root.left = deleteNode(root.left,key); if (root.val<key) root.right = deleteNode(root.right,key);return root;}
}

迭代法

class Solution {public TreeNode deleteNode(TreeNode root, int key) {if (root == null) return null;TreeNode cur = root;TreeNode pre = null;while (cur != null) {if (cur.val == key) break;pre = cur;if (cur.val > key) cur = cur.left;else if (cur.val < key) cur = cur.right;}if (pre == null) {return deleteOneNode(cur);}if (pre.left != null && pre.left.val == key) {pre.left = deleteOneNode(cur);}if (pre.right != null && pre.right.val == key) {pre.right = deleteOneNode(cur);}return root;}private TreeNode deleteOneNode(TreeNode root) {//第二种情况目标值为叶子节点if (root.left==null&&root.right==null){return null;}//第三种情况目标值左为空 右不为空else if (root.left!=null&&root.right==null){return root.left;}//第四种情况目标值右为空 左不为空else if (root.right!=null&&root.right==null){return root.right;}//第五种情况目标值左右都不为空else {TreeNode cur = root.right;while (cur.left!=null) cur = cur.left;cur.left = root.left;return root.right;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

十二个“一”的假想人物设定

选取这十二个“一”的其中四个与小说《雪中悍刀行》的四位人物作比较&#xff0c;从性格、行为、做派等方面来将四组人和字衔接在一起。 第一组人物便是北凉世子徐凤年&#xff0c;选取的“一”和图像分别为&#xff1a; 徐凤年是北凉世子&#xff0c;在世人眼中就是个纨绔子…

4K工业级高清4进1出DP自动USB KVM多电脑切换器(MT-PK401)

迈拓维矩工业级4进1出HDMI KVM多电脑切换器能通过一套键鼠和显示器来控制2台主机&#xff0c;分辨率高达4K/60Hz&#xff0c;且无需安装其他任何软件兼容各种系统&#xff0c;多种切换方式给您的操作带来更方便的体验。 ●高清DP接口、支持分辨率4K*2K60HZ ●支持自动定时循环…

4K工业级高清2进1出DP自动USB KVM多电脑切换器(MT-PK201)

迈拓维矩工业级2进1出DP KVM多电脑切换器能通过一套键鼠和显示器来控制2台主机&#xff0c;分辨率高达4K/60Hz&#xff0c;且无需安装其他任何软件兼容各种系统&#xff0c;多种切换方式给您的操作带来更方便的体验。 ●高清DP接口、支持分辨率4K*2K60HZ ●支持自动定时循环切…

4K工业级高清2进1出HDMI自动USB KVM多电脑切换器(MT-HK201)

​迈拓维矩工业级2进1出HDMI KVM多电脑切换器能通过一套键鼠和显示器来控制2台主机&#xff0c;分辨率高达4K/60Hz&#xff0c;且无需安装其他任何软件兼容各种系统&#xff0c;多种切换方式给您的操作带来更方便的体验。 ●高清HDMI接口、支持分辨率4K*2K60HZ ●支持自动定时…

服务器kvm切换器维修,服务器数字KVM切换器

服务器数字KVM切换器选配型号a.d-vvm双固定全电源驱动器。此方案可有效对电脑控制板与单片机驱动进行切换。方案加入了kvm切换器的加速键已经移除&#xff0c;且对电脑控制板与单片机驱动进行切换。此方案可有效对电脑控制板与单片机驱动进行切换。此方案可有效对电脑控制板与单…

ATEN CS22DP 2端口USB DisplayPort带线式KVM多电脑切换器 (外接式切换按键)

●通过一组USB鼠标、键盘及DisplayPort屏幕切换控制两台电脑 ●支持高质量的视频分辨率- 最高支持4096 x 2160 30Hz ●通过外接式切换按键选择切换想要操控的电脑 ●操作系统支持&#xff1a;Windows、Mac及Linux ●支持DisplayPort Dual-Mode(DP)*- 通过外接电源的DisplayPor…

KVM切换器简介

什么是KVM切换器 所谓KVM&#xff0c;也被称为多电脑控制器&#xff0c;正式的名称为多计算机切换器。简单的说&#xff0c;就是一组键盘、显示器和鼠标&#xff0c;控制2台、4 台、8台、16台甚至到4096台以上的计算机主机。 KVM主要是一机多用&#xff0c;解决多服务器或工作…

宏正ATEN发行全新高端式IP-Based Cat 5 KVM多电脑切换器

2019独角兽企业重金招聘Python工程师标准>>> 全球数字信息分享领导厂商– 宏正自动科技&#xff08;ATEN International&#xff09;今日发表三款创新KVM Over the NET™多电脑切换器&#xff0c;进一步扩展宏正旗下的ALTUSEN™企业级产品线阵容。这三款IP-Based Ca…

宏正自动科技推出首款触摸屏LCD KVM多电脑切换器

2019独角兽企业重金招聘Python工程师标准>>> KL3116T无需加装驱动程序&#xff0c;适用于工厂生产线、实验室或机房等工业环境 全球数字信息分享领导厂商–宏正自动科技&#xff08;ATEN International&#xff09;发表首款采用触控式LCD显示器的双滑轨16端…

4K工业级高清4进1出HDMI自动USB KVM多电脑切换器(MT-HK401)

迈拓维矩工业级4进1出HDMI KVM多电脑切换器&#xff08;MT-HK401&#xff09; 【四台主机共享一个显示器】 一、产品简介 一键切换方便切换、高清4K3D视效、自动定时循环切换、桌面控制器方便快捷 二、产品特点 共享显示器 加快办公效率 迈拓维矩工业级4进1出HDMI KVM多电…

宏正自动科技发表新款8/16端口双滑轨LCD KVM多电脑切换器

2019独角兽企业重金招聘Python工程师标准>>> CL5808/CL5816整合多项先进技术&#xff0c;有效节省机房空间、提升管理效益 全球数字信息分享领导厂商 – 宏正自动科技&#xff08;ATEN International, 6277&#xff09;今日宣布推出新款8端口及16端口双滑轨…

kvm多电脑切换器发展史

第一代手动KVM 当机房日益增加服务器等设备的时候&#xff0c;机柜内无法容纳更多的操作端&#xff08;键盘、鼠标、显示器&#xff09;&#xff0c;这个时候&#xff0c;历史需要一种能实现操作端共享的设备。这个时候&#xff0c;KVM诞生了&#xff0c;KVM原名为‘鼠标、键盘…

kvm切换显示不同服务器界面,让复杂变简单 体验KVM多电脑切换器

KVM切换器(简称为KVM)&#xff0c;就是我们通常所说的多电脑切换器&#xff0c;它是Keyboard(键盘)、Video(显示器)和Mouse(鼠标)三个单词的第一个字母。通过它&#xff0c;用户可以只使用一组键盘、显示器和鼠标即可控制多台电脑&#xff0c;把复杂的操作变简单。怎么样&#…

KVM 多电脑切换器(KVM Switch)

服务器监管关键设备--多电脑切换器(KVM Switch) KVM多电脑切换器是一项先进的硬件解决方案&#xff0c;更是现代服务器监管的关键设备&#xff0c;可协助用户通过由单一键盘 (Keyboard) 、显示器 (Video) 及鼠标 (Mouse) 所组成的控制端&#xff0c;轻松访问并集中管理多达上千…

[ChatGPT]

最近hatGPT火爆全宇宙&#xff0c;几乎所有圈内人都在谈论这个美国人工智能公司OpenAI发布免费机器人对话模型ChatGPT&#xff08;GPT-3.5系列&#xff09;&#xff0c;模型中首次采用RLHF&#xff08;从人类反馈中强化学习&#xff09;方式。模型目前处于测试阶段&#xff0c;…

Vamei最后的诗

豆瓣地址 https://www.douban.com/note/707640334/#comments 博客园地址 https://www.cnblogs.com/vamei/ Vamei最后写的诗

HarmonyOS应用开发-Img上一张下一张实现

创建项目示例代码 (图片自备) index.hml <div class"container"><div class"img-div"><image class"img" src"{{imgArr[idx]}}"></image></div><text style"font-size:16px;width: 100%;text…

2019清北学堂济南分校提高组腾飞营游记

2019.8.5 Day 0: 半夜试图打游戏&#xff0c;未遂 早上六点钟被手机铃声吵醒&#xff0c;感觉又虚又困。 七点快到八点的时候到火车站排队等检票&#xff0c;扔垃圾的时候看见了ghy巨佬&#xff0c;%%% 上了车&#xff0c;老姐去了后面的车厢&#xff0c;我与同校其他julao坐…

AP 计算机 从忐忑不安到轻松满分---多伦多学生如何从零腾飞!

AP 计算机 真知源自实践&#xff0c;盛誉源自读者&#xff1b;孜孜不倦&#xff0c;止于至善 ---林振营老师编著的中国第一套 AP计算机教材学生评价 AP计算机 AP微积分 A Level计算机 IGCSE计算机 支持远程现场互动教学 wechat:APFlying 在跟林振营…

情感虽失意,事业定腾飞

2019独角兽企业重金招聘Python工程师标准>>> 马上要春节了嘛&#xff0c;提前跟单位请了假&#xff0c;因为今年与往年不同&#xff0c;我有对象了&#xff0c;领对象回家见见父母&#xff0c;其实我与我对象已经领证了&#xff0c;感觉一上来&#xff0c;啥都对了。…