二叉搜索树

k-Wave仿真例程:创建超声换能器并绘制声场分布 k-Wave软件是为了模拟超声波在1D、2D或3D中的传播。应用示例包括:- 均匀和非均匀介质中的传播- 模拟各种类型的传感器- 模拟多普勒效应- 衍射、折射和反射- 光声、超声成像- 波束合成、成像重建- 模拟弹性波。 阅读详情

二叉搜索树

搜索树结构支撑许多动态集合操作,包括SEARCH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT和DELETE等。使用一颗搜索数既可以作为一个字典
又可以作为一个优先队列

二叉搜索树的基本操作所花费时间与这颗树的高度成正比。对于有n个节点的完全二叉树来说,操作的最坏运行时间为θ(lgn)。但如果这颗树是一条包含n个节点的链表,那操作的最坏运行时间为θ(n)

简介

二叉搜索树是以一个二叉树构建的搜索树。可以使用一条链表数据结构来表示,其中每个节点就是一个对象。除key和卫星数据外,每个节点还包含属性left、right和p,他们分别指向节点的左孩子、右孩子和双亲。如果某个孩子节点或父节点不存在,则相应属性值为NIL
在这里插入图片描述
二叉搜索树的关键字总是以满足二叉搜索树性质的方式存储:
设x是二叉搜索树中的一个节点。如果y是x的左子树中的一个节点,那么y.key <= x.key。如果y是x的右子树中的一个节点,那么y.key >= x.key

二叉搜索树性质允许通过一个简单的递归算法来按序输出所有的关键字,这种算法称为中序遍历算法。中序遍历输出的子树根的关键子位于其左子树关键字值和右子树关键字值之间。类似先序遍历输出的根的关键字在其左右子树的关键字值之前;后序遍历输出的根的关键字在其左右子树的关键字值之后。过程INORDER-TREE-WALK可以输出一颗二叉搜索树T中所有的元素

INORDER-TREE-WALK(x)
1   if x != NIL
2   INORDER-TREE-WALK(x.left)
3   print x.key
4   INORDER-TREE-WALK(x.right)

如果x是一颗有n个节点子树的根,调用INORDER-TREE-WALK(x)需要θ(n)时间

查询二叉搜索树

查找指定对象

在一颗二叉搜索树中查找具有给定关键字的节点,输入一个指向树根的指针和一个关键字k,如果这个节点存在,TREE-SEARCH返会一个指向关键字为k的节点指针,否则返回NIL

TREE-SEARCH
1   if x == NIL or k == x.key
2       return x
3   if k < x.key
4       return TREE-SEARCH(x.left, k)
5   else return TREE-SEARCH(x.right, k)

从树根开始查找,并沿着这颗树中的一条简单路径向下进行,对遇到的每个节点,比较关键字k与x.key。如果两个关键字相等,查找终止,返回结果。如果k小于x.key,查找在x的左子树中继续;如果k大于x.key,查找在右子树中。从树根开始递归期间遇到的节点就形成了一条向下的简单路径,所以TREE-SEARCH的运行时间为O(h),h为树的高度

也可以使用while循环展开递归

ITERATIVE-TREE-SEARCH(x,  k)
1   while x != NIL and k != x.key
2       if k < x.key
3           x = x.left
4       else x = x.right
5   return x

最大关键字元素和最小关键字元素

通过从树根开始沿着left孩子指针直到遇到一个NIL,便找到了最小关键字元素

TREE-MINIMUM(x)
1   while x.left != NIL
2       x = x.left
3   return x

通过从树根开始沿着right孩子指针直到遇到一个NIL,便找到了最大关键字元素

TREE-MAXIMUM(x)
1   while x.right != NIL
2       x = x.right
3   return x

以上查找最小、最大关键子元素均能在O(h)内执行完成,h为树高。与查找指定对象方法一样,所经过的节点形成了一条从树根向下的简单路径

后续和前驱

给定二叉搜索树的一个节点,按中序遍历的次序查找其后续,如果所有关键字都不相同,则一个节点x的后续是大于x.key的最小关键字的节点。一颗二叉搜索树的结构允许我们通过没有任何关键字的比较来确定一个节点的后续。方法TREE-SUCCESSOR(x)为查找后续的算法

TREE-SUCCESSOR(x)
1   if x.right != NIL
2       return TREE-MINIMUM(x.right)
3   y = x.p
4   while y != NIL and x == y.right
5       x = y
6       y = y.p
7   return y

上述算法分为两种情况,第一种情况,x的右子树不为空,x的后续是x的右子树的最左节点。第二种情况,如果x右子树为空,那么x的后续y,是x的最底层祖先,并且y的左孩子也是x的一个祖先。在一颗高度为h的树上,TREE-SUCCESSOR的运行时间为O(h),因为该过程或者遵循一条简单路径向上或者尊从简单路径向下。方法TREE-PREDECESSOR与TREE-SUCCESSOR是对称的,运行时间也是O(h)

即使关键字非全不相同,仍然定义任何节点的后续和前驱分别为调用TREE-SUCCESSOR(x)和TREE-PREDECESSOR(x)所返回节点

插入和删除

插入

要将一个新值v插入到一颗二叉搜索树T中,需要调用过程TREE-INSERT.该过程以节点z作为输入,z.key = v,z.left = NIL, z.right=NIL,插入过程需要修改T和z的某些属性,把z插入到树中的相应位置上

TREE-INSERT(T, z)
1   y = NIL
2   x = T.root
3   while x != NIL
4       y = x
5       if z.key < x.key
6           x = x.left
7       else x = x.right
8   z.p = y
9   if y == NIL
10      T.root = z
11  elseif z.key < y.key
12      y.left = z
13  else y.right = z

TREE-INSERT方法从树根开始,指针x记录一条向下的简单路径,并查找要替换的输入项z的NIL。该过程保持遍历指针y作为x的双亲,while循环使两个指针沿树向下移动,向左或向右移动取决于z.key和x.key的比较,直至x变为NIL,这个NIL则为输入z要放置的位置。y则为输入z的双亲节点,根据z.key和y.key的比较决定是放y的左边还是右边,当y为NIL时直接设置z为根节点

删除

从一颗二叉搜索树T中删除一个节点z分为三种情况

  • 如果z没有孩子节点,直接删除z,并修改父节点,设置孩子节点为NIL替换z

  • 如果z只有一个孩子,将这个孩子提升到树中z的位置上,并修改z的父节点,用z的孩子来替换z

  • 如果z有两个孩子,找z的后续y,y一定在z的右子树中,并让y占据树中z的位置,z的原来右子树部分成为y的新右子树,并且z的左子树成为y的新左子树

从一颗二叉搜索树中删除节点z,取指向T和z的指针作为输入

  • 如果z没有左孩子,那么用右孩子替换z,当右孩子为NIL,则是z没有孩子节点的情况;当右孩子不为NIL,则是z只有一个孩子节点的情况

在这里插入图片描述

  • 如果z仅有一个孩子且为左孩子,那么用其左孩子来替换z

在这里插入图片描述

  • z既有一个左孩子又有一个右孩子,则需要查找z的后续y,这个后续在z的右子树中并且没有左孩子。将y移出原来位置进行拼接,替换z的位置

  • 如果上步中得到的y是z的右孩子,则用y替换z,并仅留下y的右孩子

在这里插入图片描述

  • 如果上步中得到的y是z右子树中的一个节点,但并非右孩子,则先用y的右孩子替换y,然后再用y替换z

在这里插入图片描述

为在二叉搜索树内移动子树,定义一个过程TRANSPLANT,用另一颗子树替换一颗子树并成为其双亲的孩子节点。当TRANSPLANT用一颗以v为根的子树来替换一颗以u为根的子树时,节点u的双亲就变为节点v的双亲,并且最后v成为u的双亲的相应孩子

TRANSPLANT(T, u, v)
1   if u.p == NIL
2       T.root = v
3   elseif u == u.p.left
4       u.p.left = v
5   else u.p.right = v
6   if v != NIL
7       v.p = u.p

从二叉搜索树T中删除删除节点z的删除过程如下

TREE-DELETE(T, z)
1   if z.left == NIL
2       TRANSPLANT(T, z, z.right)
3   elseif z.right == NIL
4       TRANSPLANT(T, z, z.left)
5   else y = TREE-MINIMUM(z.right)
6       if y.p != z
7           TRANSPLANT(T, y, y.right)
8           y.right = z.right
9           y.right.p = y
10      TRANSPLANT(T, z, y)
11      y.left = z.left
12      y.left.p = y

在一颗高度为h的二叉搜索树上,实现动态集合操作INSERT和DELETE的运行时间均为O(h)

随机构建二叉搜索树

二叉搜索树上的每个基本操作都能在O(h)时间内完成,其中h为这颗树的高度。随着元素的插入和删除,二叉搜索树的高度在变化,如果n个关键字严格按递增顺序插入,则这颗树一定是高度为n-1的一条链。为此,我们定义n个关键字的一颗随机构建二叉搜索树为按随机次序插入这些关键字到一颗初始的空树中而生成的树,输入关键字的n!个排列中的每个等可能地出现

一颗有n个不同关键字的随机二叉搜索树的期望高度为O(lgn)

AI 小说生成器本地部署完全指南 这篇文章介绍了本地部署AI小说生成器的完整指南,主要面向网文作者、内容创作者和AI爱好者。文章从环境搭建到创作实践,详细讲解了三种主流部署方案:Ollama(推荐新手)、LMStudio(图形界面)和text-generation-webui(高级定制)。内容涵盖硬件需求、系统架构、模型选择、API对接、提示词工程等关键技术环节,并提供了小说创作的特制提示词模板和参数调优建议。文章还讨论了长篇小说管理、多模型协作等进阶技巧,以及版权伦理等法律问题。最后推荐了相关工具资源和社区论坛,帮助读者实现安全、高效、可 阅读详情

相关推荐

systrace分析 之 问题初步定位

如下surfaceflinger空缺点,上面对应的bufferTX 中有buffer,但VSYNC-SF 过来后,SurfaceFlinger却没有去取,检查测试app “android.settings”, 也没有GPU completion 时间长的问题,所以该部分可以请SurfaceFlinger的owner 进一步确认为何不取buffer。. GPU拿的是acquireFence HWC拿的是releaseFence, GPU是绘图,HWC是合成显示,这两个是互相等待的关系,

yangzex的专栏 3197

强迫症的随机二叉树

分享一个生成随机二叉树的小想法 PS:写这篇帖的人患了强迫癌,症状极其严重。 最近学习数据结构写了一些二叉树的算法,但偶尔调试的时候想整一棵随机二叉树来验证,自己建总是觉得随机性不高,所以抱着研究的心态写一个生成随机二叉树的代码,跟大家分享一个想法,有不足的地方,但希望可以帮到一些有需要的朋友。 关于二叉树的概念,网上很多大神的分析都很到位,而且还有动画大神直接图形化的超级带感,这里就不多说了。由于后面要用到节点位置的值,所以这里简单讲一下二叉树位置的一些表示方法: 对于左边的满二叉树而言,根节点位置是1

if_Riffraff的博客 1281

连接HP C7000 OA管理口操作文档

必备工具:1台便携式笔记本电脑、1根网线 2、 在C7000机箱背面找到 OA管理模块,如图:图标1和2为OA主备管理模块 将网线一端接至左边的OA管理网口,另一端接至便携式笔记本电脑网口,如图下位置: 在C7000液晶面板下查看OA管理口地址,如图,按下液晶面板的OK按钮 然后按下▼按钮调至Enclosure Info这一项后,按下OK按钮,输出界面如图:可以看到当前Active的OA管理口IP地址 比如显示地址为172.16.25.30,则个人笔记本电脑则配置172.16...

马晓援的博客 6014

随机——二叉树

第二次学习二叉树,看到一篇写得很好的文章。装下来以后看。 深入学习二叉树。

weixin_44080656的博客 854

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 337

Unity机械拆装实战:5步搞定发动机模型交互式装配(附完整代码)

本文详细介绍了在Unity中实现高交互性机械拆装仿真的完整流程。以发动机模型为例,通过5个核心步骤:项目初始化与模型准备、核心交互实现、智能装配逻辑、场景管理与相机控制、进阶优化与扩展,系统讲解了从零构建交互式装配功能的方法,并提供了完整的代码示例。

weixin_28049429的博客 217

【算法导论】【随机二叉搜索树】

我们已经证明了二叉搜索树上的每个基本操作都能在O ( h ) O(h)O(h)时间内完成,其中h hh为这棵树的高度。然而,随着元素的插入和删除,二叉搜索树的高度是变化的。例如,如果n nn个关键字按严格递增的次序被插入,则这棵树一定是高度为n − 1 n-1n−1的一条链。 遗憾的是,当一棵二叉搜索树同时由插入和删除操作生成时,我们对这棵树的平均高度了解的甚少。当树是由插入操作单独生成时,分析就会变得容易得多。因此,我们定义n nn个关键字的一棵随机构建二叉搜索树为按随机次序插入这些关键字到棵初始的空树中

Lxyking123的博客 660

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 414

(十一)二叉查找树

一颗二叉查找树 /*******************************************二叉查找树,支持的操作包括:SERACH、MINIMUM、 MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT、DELETE。 定理:对于一个高度为h的二叉查找树,操作SERACH、MINIMUM、 MAXIMUM、PREDECESSOR、SUCCESSOR的运行时间均为

JJDiaries 1932

【Cadence】Virtuoso@LayoutXL 差分电路版图镜像同步技巧详解

本文详细介绍了在Cadence Virtuoso LayoutXL中实现差分电路版图镜像同步的技巧,包括核心需求、环境配置、分步操作指南及高级技巧。通过使用LayoutXL的Group功能,工程师可以高效保持差分电路的对称性,提升版图迭代效率,确保高速信号处理的稳定性。特别适用于深亚微米工艺下的差分放大器设计。

weixin_29215391的博客 324

12V转5V稳压电路详细分析(7805三端稳压,LM2596稳压)

7805线性三端稳压 DCDC的意思是直流变到直流(不同直流电源值的转换),只要符合这个定义都可以叫DCDC转换器,或称之为开关电源或开关调整器。 7805属于常用的线性三端稳压器,输入电压范围不大于35V,输入输出压差2V,最大输出电流1.5A,下图为原理图,其原理简单,使 用方便,深受很多用户的喜爱。但是其不足之处就是效率低,特别是压差越大时其效率越低。比如这里12V转5V的效率为 5V/12V≈41.7%。 如上电路是最经典的7805稳压5V电路,电路中有两个电容,电容的作用如下: ...

a2001444的博客 9万+

【数据结构】二叉搜索树

【数据结构】二叉搜索树的增删改查实现

weixin_62533201的博客 534

老旧项目重构踩坑记:Claude Code 渐进式重构的 4 个关键阶段

揭示在老旧 Java/Spring Boot 项目中实施渐进式重构的关键实践,聚焦 Claude Code 如何通过契约化建模(CLAUDE.md)、显式上下文控制与不可变接口约束,实现安全、可验证的模块化演进,避免连锁故障。

weixin_28728443的博客 50

【二叉搜索树】二叉搜索树的用法以及实现

二叉搜索树的用法以及实现

有趣的中国人的博客 1657

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

二叉搜索树详解

二叉搜索树(Binary Search Tree)顾名思义是一种特殊的二叉树,主要用于查找与去重,与我们常见的二叉树不同,他对于结点的值有特殊的要求,二叉搜索树的定义如下主要有以下3点。这里我们的33大于15,在15的右子树上面,仿佛没有错,但是我们以30为父节点来看,33大于30,却出现在30的左子树上面,这是错误的!删除只有一个孩子的结点相对来说还是比较简单的,我们要找到要删除节点的父亲结点,并判断是父亲节点的左边还是右边,子节点的左边还是右边,最后链接起来就可以了。修改如下图后结果就是正确的了。

2301_79964905的博客 1213

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【C++】二叉搜索树

二叉搜索树的相关基本操作

大三小白C++进阶之路 1184

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 散列表及HashMap
下一篇: 垃圾收集器与内存分配策略
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值