二叉搜索树的插入,删除

先来介绍一下,

一棵非空的二叉搜索树满足以下特征:

1.每个结点都有一个作为搜索依据的关键码,所有结点的关键码互不相同。

2.左子树(如果存在)上的所有结点的关键码均小于根结点的关键码。

3.右子树(如果存在)上的所有结点的关键码均大于根结点的关键码。

4.根结点的左右子树也都是二叉搜索树。

比如下图就是一棵二叉搜索树:


下面来详细介绍一下二叉搜索树的相关操作。


二叉搜索树查找操作:

分割式查找法:
○若根结点的关键码等于查找的关键码,成功。
○否则,若小于根结点的关键码,查其左子树。大于根结点的关键码,查其右子树。
比如在下图中:




二叉搜索树插入操作:

○首先执行查找算法,找出被插结点的父亲结点。

○判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。

○若二叉树为空。则首先单独生成根结点。

注意:新插入的结点总是叶子结点。

举个例子来说明插入的顺序:

给出关键码:K = {50,19,35,55,20,5,100,52,88,53,92}

依次插入生成的二叉搜索树为(加圈的为插入次序):


对二叉搜索树的检索,每一次只需与结点的一棵子树相比较。

在执行插入操作时,也不必像在有序线性表中插入元素那样要移动大量的数据,而只需改动某个结点的空指针插入一个叶结点即可。

与查找结点的操作一样,插入一个新结点操作的时间复杂度是根到插入位置的路径长度,因此在树形比较平衡时二叉搜索树的效率相当高。

所谓的树形平衡,可以简单的理解为“接近于完全二叉树”,也就是每个叶子的高度都基本趋于一致。



二叉搜索树删除操作情况1:

叶子结点:直接删除,更改它的父亲结点的相应指针场为空。

这里就不举例说明了, 删除叶子节点即可。


二叉搜索树删除操作情况2:

子树的根结点:若被删结点的左儿子为空或者右儿子为空。

举个栗子:


删除之后的二叉搜索树:


二叉搜索树删除操作情况3:

要删除的节点有两个子节点:

○合并删除(数的高度可能会增加,不优)

○通过复制进行删除(优)

下面先来介绍一下合并删除的基本流程:

下面来看合并删除的两个栗子:

1.在合并删除后,树的高度增加:

2.还有一种情况是,在合并删除后,树的高度降低:

下面再来介绍一下复制删除的基本原理:

简单来说,复制删除就是要删除的节点有两个子节点,则通过复制进行删除。

选取“替身”取代被删结点。

那么如何选择替身呢?

替身的选择:

○左子树中最大的结点

○右子树中最小的结点

将替身的数据场复制到被删结点的数据场。

下面具两个栗子。

首先是使用左子树中最大的结点当作替身:

接下来这个例子是使用右子树中最小的结点来作为替身:

那么二叉搜索树的基本内容我们就介绍到这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值