二叉搜索树的插入,删除

来源:互联网 发布:sql注入漏洞如何处理 编辑:程序博客网 时间:2024/06/07 02:53

先来介绍一下,

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

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

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

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

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

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


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


二叉搜索树查找操作:

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




二叉搜索树插入操作:

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

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

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

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

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

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

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


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

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

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

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



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

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

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


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

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

举个栗子:


删除之后的二叉搜索树:


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

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

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

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

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

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

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

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

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

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

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

那么如何选择替身呢?

替身的选择:

○左子树中最大的结点

○右子树中最小的结点

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

下面具两个栗子。

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

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

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

0 0
原创粉丝点击