前置知识:二叉树的概念及性质
为了保证学习效果,请保证已经掌握前置知识之后,再来学习本章节!
学习目标
- 理解二叉排序树的概念
- 理解二叉排序树的查找、插入、删除、构建和简单平衡的过程
- 掌握 STL 的容器
map
、set
的使用方法及其用途
二叉排序树的概念
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree)、二叉搜索树,是指一棵空树,或者是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值。
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
- 它的左、右子树也分别为二叉排序树。
- 一般没有键值相同的结点,如下左图。(也存在键值可的二叉排序树,如下右图)
正在上传…重新上传取消
二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势。二叉排序树是基础性数据结构,用于构建更为抽象的期望数据结构,比如 set(集合)、multiset(可重复键值集合)、map(关联数组)、multimap(可重复键值关联数组)等。
二叉排序树有一个很重要的性质: 中序遍历二叉排序树可以得到一个关键字的递增序列。这也是为什么它叫二叉排序树的原因。
二叉排序树的操作
二叉排序树的查找、插入、删除的复杂度等于树高,期望复杂度均为 O(\log_2 n)O(log2n),当数列有序时,二叉排序树退化成线性表,此时最坏,复杂度为 O(n)O(n)。
查找
在二叉排序树 b 中查找元素 x 的算法:
(1)若 b 是空树,则查找失败;否则执行(2)。
(2)若 x 等于 b 的根结点的数据域之值,则查找成功;否则执行(3)。
(3)若 x 小于 b 的根结点的数据域之值,则搜索左子树;否则执行(4)。
(4)查找右子树。
插入
向键值不可重复二叉排序树 b 中插入一个结点 s 的算法:
(1)若 b 是空树,则将 s 所指结点作为根结点插入;否则执行(2)。
(2)若 s->data 等于 b 的根结点的数据域之值,则不插入,直接返回;否则执行(3)
(3)若 s->data 小于 b 的根结点的数据域之值,则把 s 插入到左子树中;否则执行(4)。
(4)把s所指结点插入到右子树中。(新插入结点总是叶子结点)
键值可重复的二叉树(STL 中实现为 multiset
),算法略。
删除
在二叉查找树删去一个结点 *p,分三种情况讨论:
(1)若 *p 结点为叶子结点,即 PL(左子树)和 PR(右子树)均为空树,由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针为空即可。
(2)若 *p 结点只有左子树 P