1. 二叉搜索树的概念
二叉搜索树,又称二叉排序数或二叉查找树。
它要么一棵空树,要么具有如下性质:
(1)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;
(2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值;
(3)它的左右子树也分别为二叉排序树;
下图就是一棵二叉搜索树
二叉排序树具有如下优点:
- 排序、查找、插入和删除方便;
- 二叉排序树的中序遍历序列为所有节点的排序结果。
- 查找的时间复杂度为 O ( l o g n ) O(logn) O(logn),仅次于通过哈希表建立数据索引来查找的方式(查找时间复杂度为 O ( 1 ) O(1) O(1));
2. 二叉搜索树的存储形式
二叉搜索树存储方式和普通二叉树一样,有两种存储方式,一种是顺序存储,一种是链式存储。
(1)顺序存储
二叉树的顺序存储,就是用一组连续的存储单元存放二叉树中的结点。因此,必须把二叉树的所有结点安排成为一个恰当的序列,结点在这个序列中的相互位置能反映出结点之间的逻辑关系,用编号的方法从树根起,自上层至下层,每层自左至右地给所有结点编号。
缺点是有可能对存储空间造成极大的浪费,在最坏的情况下,一个深度为 k k k且只有 k k k个结点的右单支树需要 2 k − 1 2^{k}-1 2k−1个结点存储空间。
依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系,这样既能够最大可能地节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。
如图所示:
图1 完全二叉树使用顺序存储结构存储。
图2 非完全二叉树改造成完全二叉树后的存储示意图。
(2)链式存储结构
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。
通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为:
其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL表示)。利用这样的结点结构表示的二叉树的链式存储结构被称为二叉链表,如图3所示。
图3 二叉树的二叉链表表示示意图
3. 二叉搜索树中的常用操作
- 查找
查找操作的思路:
(1)从根节点开始查找,如果根节点为空,则返回NULL;
(2)如果根节点非空,则将查找数据和根节点比较,
(3)如果查找数据大于根节点,则在右子树继续查找;
(4)如果查找数据小于根节点,则在左子树继续查找;
(5)如果查找数据等于根节点的值