先来介绍一下,
一棵非空的二叉搜索树满足以下特征:
1.每个结点都有一个作为搜索依据的关键码,所有结点的关键码互不相同。
2.左子树(如果存在)上的所有结点的关键码均小于根结点的关键码。
3.右子树(如果存在)上的所有结点的关键码均大于根结点的关键码。
4.根结点的左右子树也都是二叉搜索树。
比如下图就是一棵二叉搜索树:
下面来详细介绍一下二叉搜索树的相关操作。
二叉搜索树查找操作:
分割式查找法:
○若根结点的关键码等于查找的关键码,成功。
○否则,若小于根结点的关键码,查其左子树。大于根结点的关键码,查其右子树。
比如在下图中:
二叉搜索树插入操作:
○首先执行查找算法,找出被插结点的父亲结点。
○判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。
○若二叉树为空。则首先单独生成根结点。
注意:新插入的结点总是叶子结点。
举个例子来说明插入的顺序:
给出关键码:K = {50,19,35,55,20,5,100,52,88,53,92}
依次插入生成的二叉搜索树为(加圈的为插入次序):
对二叉搜索树的检索,每一次只需与结点的一棵子树相比较。
在执行插入操作时,也不必像在有序线性表中插入元素那样要移动大量的数据,而只需改动某个结点的空指针插入一个叶结点即可。
与查找结点的操作一样,插入一个新结点操作的时间复杂度是根到插入位置的路径长度,因此在树形比较平衡时二叉搜索树的效率相当高。
所谓的树形平衡,可以简单的理解为“接近于完全二叉树”,也就是每个叶子的高度都基本趋于一致。
二叉搜索树删除操作情况1:
叶子结点:直接删除,更改它的父亲结点的相应指针场为空。
这里就不举例说明了, 删除叶子节点即可。
二叉搜索树删除操作情况2:
子树的根结点:若被删结点的左儿子为空或者右儿子为空。
举个栗子:
删除之后的二叉搜索树:
二叉搜索树删除操作情况3:
要删除的节点有两个子节点:
○合并删除(数的高度可能会增加,不优)
○通过复制进行删除(优)
下面先来介绍一下合并删除的基本流程:
下面来看合并删除的两个栗子:
1.在合并删除后,树的高度增加:
2.还有一种情况是,在合并删除后,树的高度降低:
下面再来介绍一下复制删除的基本原理:
简单来说,复制删除就是要删除的节点有两个子节点,则通过复制进行删除。
选取“替身”取代被删结点。
那么如何选择替身呢?
替身的选择:
○左子树中最大的结点
○右子树中最小的结点
将替身的数据场复制到被删结点的数据场。
下面具两个栗子。
首先是使用左子树中最大的结点当作替身:
接下来这个例子是使用右子树中最小的结点来作为替身:
那么二叉搜索树的基本内容我们就介绍到这里。