树,二叉树,查找算法总结

树,二叉树,查找算法总结

一.思维导图

树,二叉树,查找算法总结

树,二叉树,查找算法总结

二.重要概念的笔记

1. 树的基本术语

1.树中一个结点的子结点个数称为该结点的度

树中结点的最大度数称为树的度

2.度大于 0 的结点称为 分支结点(又称为非终端结点)。

度为 0 的(没有子女结点)的结点称为叶子结点(又称为终端结点)。

在分支结点中,每个结点的分支树就是该结点的度。

3.树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的.

路径长度是路径上所经过的边的个数

注意:由于树中分支是有向的,即从双亲结点指向孩子结点,所以树中的路径是从上向下的,同一个 双亲, 结点的两个孩子结点之间不存在路径

4.结点的层次从树根开始定义,根结点为第 1 层,它的子结点为第2 层,依次类推。

结点的深度是从根结点开始自顶向下逐层累加的。

结点的高度是从叶结点开始自底向上逐层累加的。

树的高度(又称为深度)是树中结点的最大层数。

2. 树的性质

  1. 树中的结点数等于所有结点的度数加1 。
  2. 度为 m 的树中第 i 层上至多有 m^(i-1) 个结点( i >= 1)。
  3. 高度为 h 的 m 叉树至多有 (m^h -1)/(m-1)个结点。
  4. 具有 n 个结点的 m 叉树的最小高度为 logm(n(m-1)+1) 。

3. 树的存储

1.双亲表示法:求父节点方便。
2.孩子表示法:求子节点方便。
3.孩子兄弟表示法:方便实现树和二叉树的相互转换。

4. 二叉树的性质

1.在二叉树的第i层上至多有2^(i-1)个结点(i>0)。
2.深度为k的二叉树至多有2^k-1个结点(k>0)。
3.对于任意一棵二叉树,如果其叶结点为N0,而度数为2的结点总数为N2,则N0=N2+1。
4.具有n个结点的完全二叉树的深度必为 log(2n)+1。
5.对完全二叉树,若从上至下、从左只右编号,则编号为i的节点,其左孩子编号必为2i,其有孩子编号必为2i+1;其双亲的编号必为i/2(i=1时为根 除外)。

5. B树

一个M阶的B树具有如下几个特征:

  1. 定义任意非叶子结点最多只有M个儿子,且M>2;
  2. 根结点的儿子数为[2, M];
  3. 除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整;
  4. 非叶子结点的关键字个数=儿子数-1;
  5. 所有叶子结点位于同一层;
  6. k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系。

6. B+树

m阶的B+树的特征:

  1. 有n棵子树的非叶子结点中含有n个关键字(B树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(B树是每个关键字都保存数据)。
  2. 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
  4. 通常在B+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
  5. 同一个数字会在不同节点中重复出现,根节点的最大元素就是B+树的最大元素。

B+树相比于B树的查询优势:

  1. B+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;
  2. B+树查询必须查找到叶子节点,B树只要匹配到即可不用管元素位置,因此B+树查找更稳定(并不慢);
  3. 对于范围查找来说,B+树只需遍历叶子节点链表即可,B树却需要重复地中序遍历,

7. 哈希冲突的解决方法:

  1. 开放定址法:
    线性探测法: 冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
    二次探查法: 冲突发生时,在表的左右进行跳跃式探测,比较灵活。

  2. 拉链法:将所有关键字为同义词的结点链接在同一个单链表中。优点:
    拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短。
    由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况。
    在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。

三.疑难问题及解决方案

平衡二叉树刚开始构建的总会出错,不是很理解四种类型的构建方法,在老师讲解和练习下,已经可以熟练掌握。

  • 在结点的左孩子的左子树中插入数据(LL)
  • 在结点的右孩子的右子树中插入数据(RR)
  • 在结点的左孩子的右子树中插入数据(LR)
  • 在结点的右孩子的左子树中插入数据(RL)

对于LL型的情况,要使用右旋来解决,将失衡点右旋到其左孩子的右孩子的位置,失衡点的左子树更新为其原来左孩子的右子树。

树,二叉树,查找算法总结
树,二叉树,查找算法总结

对于RR型的情况,要使用左旋来解决,将失衡点左旋到其右孩子的左孩子的位置,失衡点的右子树更新为其原来右孩子的左子树。

树,二叉树,查找算法总结
树,二叉树,查找算法总结

对于LR型的情况,要使用先对失衡点的左孩子进行左旋,然后再对失衡点进行右旋来解决。

树,二叉树,查找算法总结
树,二叉树,查找算法总结

对于RL型的情况,要使用先对失衡点的右孩子进行右旋,然后再对失衡点进行左旋来解决。

树,二叉树,查找算法总结
树,二叉树,查找算法总结
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114448.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 功率放大器电路设计「建议收藏」

    功率放大器电路设计「建议收藏」一、实验目的掌握功率放大器的设计方法。了解功率放大器的测试方法。二、实验内容及结果实验内容自主设计一低频功率放大器,满足如下要求:(1)输入正弦信号电压有效值为5mV,在8Ω电阻负载(一端接地)上,输出功率大于1W,输出波形无明显失真;(2)通频带为20Hz~20kHz;(3)输入电阻为600Ω。实验具体要求如下:(1)设计电路,利用Multisim软件绘制电路原理图。(2)阐述功率放大原理。(3)在输入信号有效值为5mV下,测量负载电压有效值,计算实际输出功率,验证是否满

    2022年6月6日
    31
  • 软件工程师待遇怎么样?软件工程师薪水到底有多高?「建议收藏」

    软件工程师待遇怎么样?软件工程师薪水到底有多高?「建议收藏」随着技术不断进步,行业对软件开发技能的需求急剧上升。在此情况下,软件工程师(程序员)薪水上涨便很正常。通常来说,个人薪水是高是低,则与自身积累的经验、所处的地点以及产业分不开。据国际调研机构IDC在报告中公开的数据:2018年,全球有2230万名的软件工程师;其中,全职程序员1165万名,兼职人员635万名,非专业人员430万名。美国拥有最多的软件工程师,651017人;其次是中国,183…

    2025年11月28日
    23
  • 大前端开发:前端如何开发 APP[通俗易懂]

    大前端开发:前端如何开发 APP[通俗易懂]做为一个前端开发人员,有时候除去传统的前端开发还需要进行其他开发,比如公众号开发,小程序开发,APP开发。本场Chat将带你从0开始,基于APICloud进行APP开发,你只需要会前端就可以。本场Chat主要内容为下:什么是APICloud?开发工具的了解;提供的前端框架;相关API;控制台;开始你的APP开发。本场Chat将会用一个新的案例从0来…

    2022年5月3日
    39
  • 进制转换(二进制、八进制、十进制、十六进制)涵盖整数与小数部分,超详细

    进制转换(二进制、八进制、十进制、十六进制)涵盖整数与小数部分,超详细今天来总结一下各种进制转换问题,详细齐全易于理解,希望对你有帮助哦!先从我们最熟悉的十进制入手吧,其他进制与十进制的转换方法都是一样的,保证能全部记住!整型有4种进制形式:1.十进制:都是以0-9这九个数字组成,不能以0开头。2.二进制:由0和1两个数字组成。3.八进制:由0-7数字组成,为了区分与其他进制的数字区别,开头都是以0开始。4.十六进制:由0-9和A-F组成。为了区分于其他数字的区别,开头都是以0x开始。先来贴一张进制转换表:一、十进制转换成二进制、八进制、十六进制

    2022年10月17日
    3
  • Linux 日志查看 | tail 命令「建议收藏」

    Linux 日志查看 | tail 命令「建议收藏」tail命令可以将文件指定位置到文件结束的内容写到标准输出。使用tail命令的-f选项可以方便的查阅正在改变的日志文件。tail-ffilename会把文件里最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容。NAME(名称)tail-outputthelastpartoffiles输出文件的最后一部分SYNO…

    2022年6月3日
    84
  • 在vb中什么被称为对象_vb控件数组怎么创建

    在vb中什么被称为对象_vb控件数组怎么创建在BCB中使用VCL控件数组(一)抱雪昨晚和网友邬彦华在OICQ上闲聊,他言及正在为朋友编一个游戏菜单,其中动态创建了一组按纽,最后却无法释放。他的实现方法如下:for(inti=1;i<=ButtonCount;i++){TSpeedButton*spdBtn=newTSpeedButton(this);spdBtn->Parent=ScrollBox;//指定父…

    2025年11月24日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号