动态查找—二叉排序树

137 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情

前言

查找表分为静态查找表和动态查找表,前面介绍了静态查找表,今天来讲一讲动态查找表。

介绍

动态查找表的特点是表结构在查找过程中动态生成,就是对于给定值key, 如果表中存在其关键字等于key的记录,则查找成功返回; 否则插入关键字等于key 的记录。通过动态查找的特点我们可以想到一种结构——排序树。没错,一种典型的动态表就是二叉排序树。

二叉排序树

二叉排序树或者是一棵空树;或者是具有如下性质的非空二叉树:

  1. 左子树的所有结点值均小于根的值
  2. 右子树的所有结点值均大于根的值
  3. 它的左右子树也分别为二叉排序树。

如下图,就是一颗二叉排序树:

image.png

二叉排序树的优点

  1. 查找过程与顺序结构有序表中的折半查找相似,查找效率高
  2. 中序遍历此二叉树,将会得到一个关键字的有序序列
  3. 如果查找不成功,能够方便地将被查元素插入到二叉树的叶子结点上, 而且插入或删除时只需修改指针而不需移动元素

从其优点可以明显看出动态查找的特性。

二叉排序树的插入和删除操作

二叉排序树的插入操作十分简单,但需要注意:若数据元素的输入顺序不同,则得到的二叉排序树形态也不同。

二叉排序树删除操作

要删除二叉排序树中的p结点,分三种情况:

  1. p为叶子结点,只需修改p双亲f的指针f->lchild=NULL或 f->rchild=NULL
  2. 当P只有左子树或右子树时,P只有左子树,用P的左孩子代替P;P只有右子树,用P的右孩子代替P
  3. 若P左、右子树均非空。需要在P左子树的根C的右子树分支找到S,S的右子树为空;P的左子树成为双亲f的左子树,P的右子树成为S的右子树,S的左子树成为S的双亲Q的右子树,用S取代p; 若C无右子树,用C取代p