前置知识:二叉树的概念及性质
为了保证学习效果,请保证已经掌握前置知识之后,再来学习本章节!
学习目标
- 理解二叉排序树的概念
- 理解二叉排序树的查找、插入、删除、构建和简单平衡的过程
- 掌握 STL 的容器
map
、set
的使用方法及其用途
二叉排序树的概念
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree)、二叉搜索树,是指一棵空树,或者是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值。
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
- 它的左、右子树也分别为二叉排序树。
- 没有键值相同的结点。
转存失败重新上传取消
二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势。二叉排序树是基础性数据结构,用于构建更为抽象的期望数据结构,比如 set(集合)、multiset、map(关联数组)、multimap等。
二叉排序树有一个很重要的性质: 中序遍历二叉排序树可以得到一个关键字的递增序列。这也是为什么它叫二叉排序树的原因。
二叉排序树的操作
二叉排序树的查找、插入、删除的复杂度等于树高,期望复杂度均为 O(\log_2 n)O(log2n),当数列有序时,二叉排序树退化成线性表,此时最坏,复杂度为 O(n)O(n)。
虽然二叉排序树的最坏效率是 O(n)O(n),但它支持动态查询,且有很多改进版的二叉排序树可以使树高为 O(\log_2 n)O(log2n),如 Treap、Splay、SBT(Size Balanced Tree)、AVL树(平衡树)、红黑树等。这些将在后面学习。
查找
在二叉排序树 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所指结点插入到右子树中。(新插入结点总是叶子结点)