二叉搜索树基本操作

本文介绍二叉树中的左旋与右旋操作,并详细解释如何求节点的后继和前驱,以及如何进行节点的删除。这些操作是实现平衡二叉树和其他树型数据结构的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

左旋转:
左旋转要求当前节点的右子节点不为空。定义两个指针 x 、 y 分别指向当前节点及当前节点的右子节点。根据 x , y 进行下图所示变换(未带箭头的链为双向链):先处理 x 的右链,再处理 x 与 y 的链接。


之后的操作需要特别注意:
如果原 x 为树根,则变换后需要更新指向树根的入口指针为 y (可以考虑传引用);否则无需更新该指针,但需更新原 x 双亲节点的子节点链接为 y 。更新的时候需要注意是更新左子节点链接还是右子节点链接。

右旋转:
按照左旋转进行对称操作即可。

求后继节点:
求 x 节点的后继节点分两种情况处理:
1、如果 x 的右子树不为空,则右子树的最左节点( minimum )即为所求。
2、如果 x 的右子树为空,则 x 的后继为 x 这样的一个最近双亲:它拥有一个同样为 x 双亲的左子节点(或 x 本身)。可以理解为从 x 开始沿着双亲链接不断向上走直到遇到第一个右转。
如果 x 不存在后继,则情况 2 会一直进行到树根为止。

求前驱节点:
进行求后继节点的对称操作。

删除节点:
设待删除节点为 z ,但可能并不需要将 z 实际脱链。
设 y 指向应实际脱链的节点(应顶替原来 z 所在位置的节点),其值有两种情况:
1、若 z 只有不超过 1 个的子节点(做多有 1 个子节点),则 y 为 z ;
2、否则 y 为 z 的后继节点。在这样的情况下, z 的后继节点即为 z 右子树的最左节点。
可以发现 y 最多只可能有 1 个子节点。
y 将脱链,预先保留 1 个指向 y 子节点(即子树)的指针 x 。因为 y 可能没有子节点,所以 x 可能为空。如果 x 不为空,设置 x 的双亲为 y 的双亲,完成一个方向(向上)的链接。如果 y 为树根( y 的双亲为空),则更新指向根节点的入口指针为 x ,否则需要设置 y 双亲的子节点链接为 x ,完成另一个方向(向下)的链接。至此,节点 y 成功脱链。如果 y 不是 z 本身,最后还需要将 y 的键与卫星数据( satellite data )拷贝到 z 。这个过程相当于先把 z 脱链,然后脱链 y 并将 y 插入到原先 z 的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值