树表的查找

树表的查找

改用动态查找表--几种特殊的树

再查找过程中动态生成

树表的几种类型

  1. 二叉排序树
  2. 平衡二叉树
  3. 红黑树
  4. B-树
  5. B+树
  6. 键树

image-20230717102243923

二叉排序树:

  1. 若其左子树非空,则左子树上所有的节点的值均小于根节点的值.

  2. 若其右子树非空,这右子树上所有节点的值均大于等于根节点的值.

  3. 其左右子树本身又是一颗二叉排序树

    image-20230717102613866

image-20230717103500120

中序遍历二叉排序树

结果是什么规律?

二叉排序树的性质:

image-20230717104221723

中序遍历非空的二叉排序树所得到的数据元素序列是一个按关键字排列的递增有序序列.

二叉排序树--查找

若查找的关键字等于根节点,成功

否则

若小于根节点,查其左子树

若大于根节点,查其右子树.

在左右子树上的操作类似.

image-20230718093443464

二叉排序树的存储结构

image-20230718093521418

1.若二叉排序树为空,则查找失败,返回空指针.

2.若二叉排序树非空,将给定值key与根节点的关键字

进行比较

image-20230718093738467

算法描述

image-20230718094132323

二叉排序树的查找分析

比较的关键字次数==此节点所在层数的次数

最多的比较次数=树的深度

image-20230718094704678

二叉排序树的平均查找长度

image-20230718095033297

含有n个节点的二叉排序树的平均查找长度和树的形态有关.

最好的情况O(logn)

最坏的情况O(n)

image-20230718095236954

如何提高形态不均衡的二叉排序树的查找效率?

做"平衡化处理",即尽量让二叉树的形状均衡!

image-20230718095534978

二叉排序树的操作--插入

image-20230718095750922

若为空,则插入节点到空树

否则,继续在其左右节点上查找

树中已经有了,不再插入

树中没有,找到待插入的位置,插入.

插入的元素一定在叶子节点上

image-20230718100054417

二叉排序树的操作--生成

image-20230718100402999

进行中序遍历就是排序

关键字的输入顺序不同,建立的二叉排序树不同

image-20230718100636634

image-20230718100834432

二叉排序树--删除

二叉排序树的删除后所得的二叉树仍然满足二叉排序树的性质不变.

image-20230719094208483

1. 被删除的节点是叶子节点:直接删除该结点.

其双亲结点中相应的指针域的值改为"空"

image-20230719094447496

2. 被删除的结点只有左子树或者只有右子树,用其左子树或右子树来替换它(结点替换).

其双亲结点的相应的指针域的值改为"指向被删除结点的左子树或右子树."

image-20230719094852488

3. 被删除的结点既有左子树,也有右子树

找到要删除结点的中序遍历的前驱或者后续结点,然后将这个结点的值改为其前驱或者后续结点的值,然后删除其其前驱或者后续结点.其中前驱结点是该结点左子树里面值最大的,后续结点是右子树里面值最小的.

注意不要将树变得更高

以其中序前趋值替换之(值替换),然后再删除该前趋结点.前趋是左子树中最大的结点

也可以用其后续替换之,然后再删除该后继结点,后继是右子树中最小的结点.

image-20230719095701173

例题

image-20230719095928467

posted @   harper886  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示