首页 > 编程语言 >C++数据结构考研chapter5树(更新ing)

C++数据结构考研chapter5树(更新ing)

时间:2024-03-19 23:29:45浏览次数:41  
标签:结点 chapter5 孩子 度为 C++ 手算 二叉树 ing 节点

一、概念

1.结点

2.边

3.根

4.叶子结点

5.分支结点

6.子树

二、术语

1.结点之间的关系描述

(1)祖先

(2)子孙

(3)双亲(父)

(4)孩子

(5)兄弟

(6)堂兄弟

(7)路径

自上而下

(8)路径长度

经过了几条边

2.结点、树的属性描述

(1)结点的层次(深度)

从上到下数,默认从1开始,看题目要求

(2)结点的高度

从下到上数

(3)树的高度(深度)

从上到下,到底

(4)结点的度

几个子节点

结论:非叶子结点度>0;叶子结点度=0

(5)树的度

结点的度max

3.有序树、无序树

(1)有序树

从左->右有序,eg家谱,先出生的在左面

(2)无序树

左右可以交换,eg国家行政区

4.森林

m棵不相交树的集合

考点:树与森林相互转换

树->森林:在头顶加个根节点,连起来

森林->树:去掉最上面的根节点

三、考点(*)

1.结点数=总度数+1

理解:总度数表示总孩子个数,一个孩子带着一根线,只有根节点头上不带线

2.度为m的树 vs m叉树

度为m的树表示至少有一个结点的度 = m,其他的都<=m

m叉树表示,一个结点的度max = m,但不要求有没有这样的结点

结论:(前者度为m的树,后者m叉树)

①任意度<=m

②至少有一个结点的度 = m;允许所有结点度<m

③一定是非空树,至少有m+1个结点;可以是空树

3.度为m的树第i层最多有 m^(i-1)个结点

该层是满的,此时最多

4.高度为h的m叉树最多有m^h-1/m-1个结点

每层都是满的

n = m^0+m^1+m^2+······+m^(h-1)

5.高度为h的m叉树最少有h个结点

每层就一个

区别:if高为h,度为m,最少h-1+m

h-1层就1个,有一层m个

6.有n个结点的m叉树最小高度为logm(n(m-1)+1) 向上取整(up)

设高度为h,树前h-1层都是满的(往宽里长),so 前h-1层满<n<=前h层满

四、二叉树

1.概念

m叉树,令m=2

2.特点

(1)每个结点最多只有两棵子树

度<=2

(2)左右孩子不能颠倒(有序)

(3)vs度=2

度为2的树至少有一个结点有两个孩子

(4)5种状态

空树、只有根节点、只有lchild、只有rchild、左右都有

3.特殊的二叉树

(1)满二叉树

1)理解

每一层都是满的,每个结点都有2个孩子,so高度为h,拥有2^h-1个结点

2)特点(自己画图就理解了)
        a)只有最后一层有叶子结点
        b)不存在度为1的结点

只有度为0和度为2的结点

        c)按层序为1开始编号
                i)位序为i的左孩子位序为2i
                ii)右孩子2i+1
                iii)i的父结点位序为i/2 down

(2)完全二叉树

将满二叉树从右下依次减少结点,都是完全二叉树

attn:满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

1)特点
        a)只有最后两层可能有叶子结点        
        b)最多只有1个度
        c)按层序为1开始编号

位序为i的lchild、rchild、parent

        d)总共有n个结点
                i)i<=n/2 down 分支结点
                ii)i>n/2 down 叶子结点

2)性质考点

a)有n个结点,高度为log2(n+1) up or log2n+1 down
b)n个结点推出度为012的结点个数

n=2k(偶数个结点) n1 = 1,n0=k,n2=k-1

n=2k+1(奇数个结点) n1=0,n0=k,n2=k-1

(3)二叉排序树

左<右

(4)平衡二叉树

每个结点的左右子树深度<=1

                                        √                                                                       ×

4.性质考点(*)

(1)非空二叉树度为012的结点,个数为n012,则n0=n1+n2

推导:n = n1+n2+n3 各度结点数相加

n = n0*0+ n1*1 + n2*2+1

(2)二叉树第i层最多有 2^(i-1)个结点

(3)高度为h的二叉树最多有2^h-1/2-1个结点

5.存储结构

(1)顺序存储

1)定义
2)初始化

空第一个元素,这样下标与位置相同,便于存取

3)打印

(2)链式存储(二叉树链式存储)

1)定义
2)初始化
3)创建(一个一个加)
每次创建的时候需要新创建结点,因为头结点在初始化的时候创建了,so直接赋值即可

6.遍历(会手算+代码)

以此为例

(1)先序

1)手算

way1:根左右依次写

way2:从根开始,先向左走,到底了再向上,可以向右再向右走,第一次到了就输出

2)代码

遇到就visit,之后递归左孩子和右孩子

(2)中序

1)手算

way1:左根右

way2:第二次到了就输出

2)代码

先递归左孩子,第二次遇到就visit,之后递归右孩子

(3)后序

1)手算

way1:左右根

way2:第三次到了就输出

2)代码

先递归左右孩子,第三次遇到就visit

(4)层序

1)手算

从左到右依次输出

2)代码

利用辅助队列,入队根节点,入队之后if队列不为null,出队,判断此结点左右孩子是否为空,if不为空,入队,循环

(5)根据次序创建树

1)前+中
2)后+中
3)层+中

7.线索二叉树

(1)作用

方便从一个结点,找它的前驱和后继

if不用线索二叉树,我们一共需要遍历两次

(2)存储结构

1)思路

n个结点的二叉树,n+1个空指针表示该节点的前驱和后继,so并非所有结点都是有空指针,so用ltag、rtag==1表示可以建设成线索二叉树,则指向某节点的前驱or后继

2)代码

(3)三种线索二叉树

前序中序后序

分别前中后序遍历,从而确定前驱和后继

(4)手算画出线索二叉树

步骤:

step1:遍历

step2:标号

step3:连线

1)前序

2)中序

3)后序

(5)用代码线索化

(6)找前驱and后继

三种树的前驱后继(6种)

8.树的存储结构

(1)逻辑结构回顾

(2)双亲表示法(顺序存储)

(3)孩子表示法(顺序+链式)

(4)孩子兄弟表示法(链式)

9.树、森林、二叉树转换(会手算)

(1)树->二叉树

(2)森林->二叉树

(3)二叉树->树

(4)二叉树->森林

五、树and森林遍历

1.树

2.森林

六、哈夫曼树

1.定义

(1)权

(2)带权路径长度

1)节点的

2)树的

(3)最优二叉树

2.构造

3.应用-哈夫曼编码

七、并查集

演示网址

1.如何表示集合关系

2.代码实现

3.存储结构

4.优化

标签:结点,chapter5,孩子,度为,C++,手算,二叉树,ing,节点
From: https://blog.csdn.net/straight_out/article/details/136741876

相关文章

  • JB Loves Math(The 19th Zhejiang Provincial Collegiate Programming Contest)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdin);freopen......
  • springboot整合springsecurity,从数据库中认证
    概述:springsecurity这个东西太容易忘了,这里写点东西,避免忘掉目录第一步:引入依赖第二步:创建user表第三步:创建一个用户实体类(User)和一个用于访问用户数据的Repository接口第四步:创建一个实现UserDetailsService接口的自定义用户详情服务类,用于从数据库中加载用户信息。第五......
  • JB Wants to Earn Big Money(The 19th Zhejiang Provincial Collegiate Programming Co
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdin);freopen......
  • JB Loves Comma(The 19th Zhejiang Provincial Collegiate Programming Contest)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdin);freopen......
  • 初识C++(上)
    目录 1.引用1.1引用特性:1.2传引用传参1.3引用返回2.重要注意事项3.函数重载3.1重载原理 4.类的认识4.2 访问限定符号4.3 类的作用域4.4类的实例化5.对象 6.this指针6.1特性6.2注意事项 1.引用 相当与给某个变量取了一个别名,但是这前者和后......
  • 使用 openssl 进行 RSA/ECB/PKCS1PADDING 加解密
    使用java进行RSA/ECB/PKCS1PADDING是非常方便的,例如下面的示例publicstaticStringpublicDecrypt(PublicKeypublicKey,Stringencrypted)throwsException{Ciphercipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");cipher.init(Cipher.DECRYPT_......
  • 无穷乘积,Wallis公式以及String公式
    鉴于这学期我从来没听过的高数课没讲无穷乘积,所以我想把这坨给补上(无穷乘积类比于级数的定义,设\(p_1,p_2,\cdots,p_n,\cdots\)是无穷可列个实数,则称它们的“积”为无穷乘积\[p_1\cdotp_2\cdot…\cdotp_n\cdot…\]记为\[\prod_{n=1}^{\infty}p_i\]类似地,定义无穷乘......
  • Cannot connect to already running IDE instance. Exception: Process 6,367 is stil
    当IntelliJIDEA显示“CannotconnecttoalreadyrunningIDEinstance.Exception:Process6,367isstillrunning”这个错误消息时,意味着它试图连接到一个已经在运行中的实例,但因为某些原因,这个操作失败了。这通常发生在IDEA无法正常关闭或在后台无法正确管理其进程......
  • Meta-Learned Attribute Self-Interaction Network for Continual and GeneralizedZer
    目录摘要介绍releatedworkzero-shotlearning零样本持续学习提出的方法bibtex格式参考文献摘要零样本学习(ZSL)是一种有希望的方法,通过利用类别属性将模型推广到训练期间未见过的类别,但仍然存在挑战。最近,利用生成模型来解决对训练期间已见类别的偏见的方法推动了技......
  • 简历管理系统java+springboot+vue
    简历管理系统1、功能介绍1.1、演示视频2、系统部分功能展示管理员功能模块用户管理功能模块模板类型管理报名招聘管理3、系统分析技术可行性操作可行性1、功能介绍本文以Java为开发技术,实现了一个简历管理系统。主要功能:管理员登录,通过填写用户名、密码、角色......