树表的查找
树表的查找
改用动态查找表--几种特殊的树
再查找过程中动态生成
树表的几种类型
- 二叉排序树
- 平衡二叉树
- 红黑树
- B-树
- B+树
- 键树
二叉排序树:
-
若其左子树非空,则左子树上所有的节点的值均小于根节点的值.
-
若其右子树非空,这右子树上所有节点的值均大于等于根节点的值.
-
其左右子树本身又是一颗二叉排序树
中序遍历二叉排序树
结果是什么规律?
二叉排序树的性质:
中序遍历非空的二叉排序树所得到的数据元素序列是一个按关键字排列的递增有序序列.
二叉排序树--查找
若查找的关键字等于根节点,成功
否则
若小于根节点,查其左子树
若大于根节点,查其右子树.
在左右子树上的操作类似.
二叉排序树的存储结构
1.若二叉排序树为空,则查找失败,返回空指针.
2.若二叉排序树非空,将给定值key与根节点的关键字
进行比较
算法描述
二叉排序树的查找分析
比较的关键字次数==此节点所在层数的次数
最多的比较次数=树的深度
二叉排序树的平均查找长度
含有n个节点的二叉排序树的平均查找长度和树的形态有关.
最好的情况O(logn)
最坏的情况O(n)
如何提高形态不均衡的二叉排序树的查找效率?
做"平衡化处理",即尽量让二叉树的形状均衡!
二叉排序树的操作--插入
若为空,则插入节点到空树
否则,继续在其左右节点上查找
树中已经有了,不再插入
树中没有,找到待插入的位置,插入.
插入的元素一定在叶子节点上
二叉排序树的操作--生成
进行中序遍历就是排序
关键字的输入顺序不同,建立的二叉排序树不同
二叉排序树--删除
二叉排序树的删除后所得的二叉树仍然满足二叉排序树的性质不变.
1. 被删除的节点是叶子节点:直接删除该结点.
其双亲结点中相应的指针域的值改为"空"
2. 被删除的结点只有左子树或者只有右子树,用其左子树或右子树来替换它(结点替换).
其双亲结点的相应的指针域的值改为"指向被删除结点的左子树或右子树."
3. 被删除的结点既有左子树,也有右子树
找到要删除结点的中序遍历的前驱或者后续结点,然后将这个结点的值改为其前驱或者后续结点的值,然后删除其其前驱或者后续结点.其中前驱结点是该结点左子树里面值最大的,后续结点是右子树里面值最小的.
注意不要将树变得更高
以其中序前趋值替换之(值替换),然后再删除该前趋结点.前趋是左子树中最大的结点
也可以用其后续替换之,然后再删除该后继结点,后继是右子树中最小的结点.
例题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本