代码随想录No22 |235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

news/2023/5/28 8:50:51

二叉搜索树的最近公共祖先、二叉搜索树中的插入操作、删除二叉搜索树中的节点

今天开始二叉树第八天的题!

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

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

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

递归:

  • 确定递归函数返回值以及参数
    参数就是当前节点,以及两个结点 p、q。
    返回值是要返回最近公共祖先,所以是TreeNode * 。
  • 确定终止条件
    遇到空返回就可以了
  • 确定单层递归的逻辑
    在遍历二叉搜索树的时候就是寻找区间[p->val, q->val](注意这里是左闭又闭)
    那么如果 cur->val 大于 p->val,同时 cur->val 大于q->val,那么就应该向左遍历(说明目标区间在左子树上)。
    需要注意的是此时不知道p和q谁大,所以两个都要判断
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':if root.val > p.val and root.val > q.val:return self.lowestCommonAncestor(root.left, p, q)if root.val < p.val and root.val < q.val:return self.lowestCommonAncestor(root.right, p, q)return root

迭代法
更清晰

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':while True:if root.val > p.val and root.val > q.val:root = root.leftelif root.val < p.val and root.val < q.val:root = root.rightelse:return root

701.二叉搜索树中的插入操作

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

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

递归:

  • 确定递归函数参数以及返回值
    参数就是根节点指针,以及要插入元素
    返回值,可以利用返回值完成新加入的节点与其父节点的赋值操作。
    递归函数的返回类型为节点类型TreeNode * 。
  • 确定终止条件
    终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。
  • 确定单层递归的逻辑
    搜索树是有方向了,可以根据插入元素的数值,决定递归方向。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:if not root: return TreeNode(val)if root.val > val:root.left = self.insertIntoBST(root.left,val)if root.val < val:root.right = self.insertIntoBST(root.right,val)return root

迭代法:

在这里插入代码片

450.删除二叉搜索树中的节点

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

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

递归:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:if not root : return  None # 节点为空,返回if root.val < key :root.right = self.deleteNode(root.right, key)elif root.val > key :root.left = self.deleteNode(root.left, key)else:# 当前节点的左子树为空,返回当前的右子树if not root.left : return root.right# 当前节点的右子树为空,返回当前的左子树if not root.right: return root.left# 左右子树都不为空,找到右孩子的最左节点 记为pnode = root.rightwhile node.left :node = node.left# 将当前节点的左子树挂在p的左孩子上node.left = root.left# 当前节点的右子树替换掉当前节点,完成当前节点的删除root = root.rightreturn root

迭代法:

在这里插入代码片

今天前两道题还可以,最后一道有点复杂,需要多加思考练习!

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

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

相关文章

如何通过snmp监控Linux

一般我们监控Linux都是通过SSH或Telnet方式&#xff0c;有时候我们不方便通过这两种方式&#xff0c;比如遇到监控端口因为安全原因被封禁、以及SSH需要密钥登录&#xff0c;这都会让监控工具很难直接远程连接。而通过SNMP的方式监控就灵活多了&#xff0c;可以指定IP来接发数据…

ashx一般处理程序

.NET里面webform的后缀是aspx WCF和WebService的后缀是asmx 然后今天拿到一个客户端代码&#xff0c;调用服务端&#xff0c;服务端后缀是ashx瞬间傻蛋了&#xff0c;.NET我不知道的组件真多。 四个疑问&#xff1a; 1、什么时候用 2、优缺点 3、简单实现机制 4、简单DEM…

Python中通过requests模块发送POST请求.

博客核心内容&#xff1a; 1、Python中通过requests模块发送POST请求. 我们通常情况下提交数据一般有两种方式:Ajax和Form表单的方式 如果request.post里面没有值,我们就到request.body里面去拿 代码示例&#xff1a; 服务端&#xff1a; from django.shortcuts import rend…

通过Anaconda安装Python

前言 自学Python也有一年时间多了吧&#xff0c;期间很少实际运用&#xff0c;光Python环境都安了删&#xff0c;删了又安的搞了几次了&#xff1b;从开始时安装的Python3.4&#xff0c;到今年安装的Anaconda套件中的Python3.6&#xff0c;Python更新了不少&#xff1b;…

【OpenGL】三维场景漫游的实现

功能 构建一个三维场景 可利用glut提供的各种简单形体来搭建&#xff0c;或者读入别的模型&#xff0c;并加入光照效果用键盘操作一个物体&#xff08;如一艘飞船&#xff0c;或一个机器人&#xff09;&#xff0c;在三维场景中漫游 视点可以放在物体上&#xff0c;或跟随物体…

LTE小区切换_UE流程

初入终端公司的modem协议工程师。对于UE PCI的变换&#xff0c;有的同事说是重选&#xff0c;有的同事说是切换。我是傻傻分不清的&#xff0c;完全不知道有什么差异。在做完一个日本项目后&#xff0c;对切换有了一定的了解。对UE切换做下简单的总结 &#xff08;以下以LTE为…

system磁盘占有率太高,进入桌面一直无法使用

system磁盘占有率太高 右键我的电脑→管理&#xff0c; 打开服务界面&#xff0c;找到 System Event Notification Seivice&#xff0c;由自动改为手动 然后&#xff0c;重启试一下&#xff0c;电脑是否会启动快一些&#xff01;

Windows10系统开机内存占有率超50%的原因

罪魁祸首就是Windows10的快速开机启动按钮&#xff0c;把这个关了你的内存占有率直线下降&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

PyTorch运行加载数据后占有大量C盘空间如何释放

刚刚用自己电脑的pycharm运行代码&#xff0c;在加载数据的过程中&#xff0c;数据集特别大&#xff0c;C盘瞬间爆满&#xff0c;原本30多G的空间&#xff0c;最小的时候只剩下几十M的空间&#xff0c;吓得我赶紧暂停了项目&#xff0c;但是C盘上的空间仍未得到充分释放。 尝试…

我的世界服务器怎么弄无限急迫,我的世界有什么指令设置无限急迫

输入/seffect p 3 99999 127然后发送(默认为回车键)&#xff0c;即可获得无限时间的急迫效果。“3”为效果ID;“99999”为持续时间;“127”为效果等级&#xff0c;你可以通过自行修改数值来改变效果。《minecraft》(《我的世界》)是一款风靡全球的高自由度沙盒游戏&#xff0c;…

使body占有整个页面

今天在完成DOM中的一个小实例&#xff08;鼠标点击页面可知道是鼠标左键&#xff0c;中键还是右键点击了页面&#xff09;时发现不知道如何将body覆盖整个页面 度娘上有说给body设置font-size:100%,或者是width:100%,height:100%,但是都没有解决问题 我看了百度的源代码才找到…

问题解决:VScode高CPU占有率 Microsoft.VSCode.CPP.Extension.darwin

一、问题描述 (Describe) 打开VScode&#xff0c;突然发现自己的Mac在发烧&#xff0c;赶紧看了看是哪个鬼在后台占用CPU 进程Microsoft.VSCode.CPP.Extension.darwin high CPU usage居然占用了181%的CPU&#xff0c;我的天 二、解决方法(Solution) 仔细想了想&#xff0c;我…

让Windows7 cpu占有率100%的分析

之前在微软的《编程之美》中有道题目大概是“控制任务管理器中cpu的曲线”&#xff0c;也就是根据自己的意愿来控制cpu的占有率。而我今天只想说的是如何让cpu占有率为100%。 首先&#xff0c;我写了如下程序&#xff1a; void main() { while(true){ int n 10;} } 也就是执行…

Chrome 浏览器以 58.09% 的市场占有率稳居世界第一

&#xff08;点击上方公众号&#xff0c;可快速关注&#xff09;来源&#xff1a;开源中国www.oschina.net/news/97018/chrome-has-the-top-share-58-09网站通讯流量监测机构 StatCounter 公布了5月份全球浏览器市场份额数据。结果显示&#xff0c;Chrome 以 58.09% 的市场占有…

你还在恐惧指针吗?点进来,带你全方位深入了解指针

指针是什么&#xff1f; 指针也就是内存地址&#xff0c;指针变量是用来存放内存地址的变量。(存放在指针中的值都被当做地址处理) 对于32位的机器&#xff0c;假设有32根地址线&#xff0c;那么假设每根地址线在寻找地址的时候会产生高电平&#xff08;高电压&#xff09;和…

CentOS7.1下 安装vncserver和删除vnc占有的端口

今天给两台新服务器装CentOs7.1系统&#xff0c;然后装VNCServer的时候感觉网上的教程要么复杂多此一举&#xff0c;要么不清楚&#xff0c;关于-list端口的部分都没讲。所以这里整理一下&#xff0c;按着下面的顺序来就可以了。 1. 首先查看是否安装了VNCserver …

Android studio工具小技巧|文件日期|市场占有率|输出日志|adb安装apk

目录 1. Android studio项目目录树每个文件后出现时间日期显示 2. 新建项目时可以查看谷歌统计的关于Android各版本市场占有率 3. 命令行输出IDE的日志到电脑本地 4. 命令行安装apk到电脑usb连接的真机上 1. Android studio项目目录树每个文件后出现时间日期显示 在更新了…

ORACLE 删除归档日志连接rman查看归档日志占有率

我们都知道在controlfile中记录着每一个archivelog文件的相关信息&#xff0c;当然们在OS下把这些物理文件delete掉后&#xff0c;在我们的controlfile中仍然记录着这些archivelog文件的相关信息&#xff0c;在oracle的OEM管理器中有可视化的日志展现出&#xff0c;当我们手工清…

2018年JVM生态系统报告,2018年JAVA生态系统报告,2018年JAVA各种市场占有率

在Java开发者中&#xff0c;一直存在着很多鄙视链。如&#xff1a; IntelliJ → Eclipse → NetBeans Unix → Linux → Mac OS→ Windows → DOS Emacs → Vim → Sublime → Word → Power Point 这诸多鄙视链中一直存在着很大的争议 也正是存在诸多争议&#xff0c;导致…

Android各版本市场占有率

http://soft.yesky.com/mobile/422/84939422.shtml http://soft.yesky.com/mobile/422/84939422.shtml http://soft.yesky.com/mobile/422/84939422.shtml http://soft.yesky.com/mobile/422/84939422.shtml http://soft.yesky.com/mobile/422/84939422.shtml Android各版本…