BST的查找、插入、删除

BST的查找、插入、删除

BST (binary search tree) 二叉搜索树
结合了vector和list的优点
主要接口有三种:查找,插入,删除

查找:

时间复杂度O(h)(即不超过树的高度)

由于BST在局部具有顺序性、在整体具有单调性的特点,因此BST的直接投影与其中序遍历相符合。关键码从左到右依次单调递增。

在查找目标关键码时,动作类似于vector中的二分查找。因为BST的特点,树根节点左侧部分的数值均比树根节点小,树根节点右侧部分的数值均比树根节点大。因此,目标关键码首先与树根节点大小进行比较,从而判断进入左分支还是右分支。再将目标关键码与分支的根节点进行大小比较,从而判断进一步的应该进入分支根节点的左分支还是分支根节点的右分支。递归调用,直到找到目标关键码的具体位置。

在进行最后一步查找时,会遇到两种情况:第一种为查找成功,此时返回目标关键码对应的节点和他的父亲。第二种为查找失败,此时会多进行一次查找。假设一个哨兵节点,其值与目标节点相等,因此返回的是一个空节点(即假想的哨兵节点)。因此无论成功与否,返回值总是等效的指向命中节点,而_hot总是指向命中节点的父亲。

插入:

时间复杂度O(h)(主要受search和updateHeightAbove,二者的时间复杂度都不超过O(h))

首先调用查找接口,返回的空节点几位目标节点所需插入的位置,而_hot即为目标节点的在树中的父亲。因此创建一个新节点(节点信息包括关键码大小和父亲节点),并与search的返回值进行绑定即可完成书中父亲节点与目标节点的相互绑定。此后,更新全树规模updateHeightAbove即可。

删除:

时间复杂度O(h)(主要受search和updateHeightAbove,二者的时间复杂度都不超过O(h),succ( )时间复杂度都不超过O(h))

首先调用查找接口,返回的空节点几位目标节点所需删除的位置,而_hot即为目标节点的在树中的父亲。

若目标节点只有一个孩子,那么用其孩子代替目标节点的位置即可。并将目标节点的父亲(即孩子的祖父节点)与目标节点的孩子进行绑定。删除目标节点即可。

若目标节点左右子树并存,调用succ( ),即找到目标节点的直接后继,将目标节点预期直接后继互换位置。此时目标节点只会有右孩子不会有左孩子(因为目标节点与其直接后继是紧邻的,中间不存在其他节点。比其直接后继小的数中的最大者即为目标节点,因此直接后继没有左孩子。因此调换位置后,其二者中间也无其他节点,即无左孩子。)此时调换后的情况即为第一种情况,即目标节点只有一个孩子的情况。用目标节点右孩子代替目标节点的位置即可。并将调换位置后目标节点的父亲(即孩子的祖父节点)与目标节点的孩子进行绑定。删除目标节点即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值