持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情。
前言
查找表分为静态查找表和动态查找表,前面介绍了静态查找表,今天来讲一讲动态查找表。
介绍
动态查找表的特点是表结构在查找过程中动态生成,就是对于给定值key, 如果表中存在其关键字等于key的记录,则查找成功返回; 否则插入关键字等于key 的记录。通过动态查找的特点我们可以想到一种结构——排序树。没错,一种典型的动态表就是二叉排序树。
二叉排序树
二叉排序树或者是一棵空树;或者是具有如下性质的非空二叉树:
- 左子树的所有结点值均小于根的值
- 右子树的所有结点值均大于根的值
- 它的左右子树也分别为二叉排序树。
如下图,就是一颗二叉排序树:
二叉排序树的优点
- 查找过程与顺序结构有序表中的折半查找相似,查找效率高
- 中序遍历此二叉树,将会得到一个关键字的有序序列
- 如果查找不成功,能够方便地将被查元素插入到二叉树的叶子结点上, 而且插入或删除时只需修改指针而不需移动元素
从其优点可以明显看出动态查找的特性。
二叉排序树的插入和删除操作
二叉排序树的插入操作十分简单,但需要注意:若数据元素的输入顺序不同,则得到的二叉排序树形态也不同。
二叉排序树删除操作
要删除二叉排序树中的p结点,分三种情况:
- p为叶子结点,只需修改p双亲f的指针f->lchild=NULL或 f->rchild=NULL
- 当P只有左子树或右子树时,P只有左子树,用P的左孩子代替P;P只有右子树,用P的右孩子代替P
- 若P左、右子树均非空。需要在P左子树的根C的右子树分支找到S,S的右子树为空;P的左子树成为双亲f的左子树,P的右子树成为S的右子树,S的左子树成为S的双亲Q的右子树,用S取代p; 若C无右子树,用C取代p