数据结构-树和二叉树

6.1.1 树的定义

6.1.1.1树的概念

树是一种非线性结构,它由节点和边组成。节点之间通过边连接.
由n(n>=o)个节点的有限集。n=0表示空树

n>1时满足:
1.有且只有一个根结点并在最顶层

2.其余结点分成互不相交的 M 个子集,每个子集又是一颗树。

01ae4e3f3ab40d0d6ee722cca213d94f

image-20240925214411226

案例

c7899e91cf258a2e5aeb58cf6a8abf39

6.1.2 树的逻辑结构表示
image-202409252147288516.1.3 树的基本术语

6.2

image-20240925215050252

1234 探讨的是节点的度

节点位置探讨 5 6->对套

抽象节点 7 ->包括孩子和孙子

8 _>H E C A 只要能找到对应父节点就继续

9 父节点下 同分支下-兄弟节点(节点层次相同 )

10 树的高度

6283648c2434efb19dab8c70ed2347bb

11

6.1.4 树的性质
1.树的节点数

7b0b909debd7b65958998b710e0b4bc2

b81c4239fcc6a1bd1ce83c3f1844d5be

节点数=总度数(数线或者自己遍历)+1

例如 A的度数 2 B C1 G 1省 3+2+1+1+2+3=12-再加上A-就是总度数

2.度为m的数第i层至多节点

image-20240925221552376

3.高度为h m次树至多有多少个节点

例如高度4 -3次树

“m 次树”指的是 每个节点的度最多为 m 的树,即每个节点最多可以有 m 个子节点。

image-20240925221953903

333*3=81-1=80/2=40

手算

A(3) 9 - 9*3=27 -27+9+1=37+BCD =40手算也能对上

6.1.5 树的基本运算
1.树的运算

image-20240925222425649

2.树的遍历

2a8c012d28887d403fce53fd6b0d2eb9

image-20240925215050252

6.1.6树的存储结构

计算机中-树存储着节点的值-还有节点与节点间的关系

1.双亲存储结构

e0d9cb587ce9a54d3ffe777dfb242eb5

302b2416bd1ef27490005e7e122998bd

2.孩子链表存储结构

e99ab18983dc7dabb1b8967997daed09

0d79d9d1aac810a3ec7802fe69b5fb16

0db38af72b0e41685ea731c78216f257

用空间换来部分算法遍历

3.孩子兄弟表示法

e4784c0f99fccd18533be7f3af34cde5

image-20240925224029517

image-20240925224041108

二叉树

二叉树的每个节点最多只有2个后继节点,度最大为2

6.2.1二叉树的定义

a95b854c64b1ee12a514fef8416e13a4

逻辑表示

注意“二叉树是度为2 的树”这句话是错的,二叉树可能度为0,度为1或者度为2,所以二叉树的度≤2

662d28dac95d48fce16b08859f1f7f6c

25e4ad07ef50280efe9411bd04d624d5

6.2.2 二叉树的性质

b10626d48c710df1a3750b31a7677610

1b3c33e0f0c0ff70793de170f1c269be

n 0->叶子节点个数–

n2-是度=2的节点个数

bab76beffd19b333ecde671999c88014

C

特殊二叉树
1.斜树

image-20240927084532399

2.满二叉树

c4474f58dbbba4b0fdbd67039efabe3d

高度为h–2h次方-1 -节点最多的情况

fdcde068645aa8213c505f9cb0530bb4

image-20240927095359810

计算节点最多情况-

0456a0c483c46ebb194c776bbaadd82e

3.完全二叉树

da5cec1b77459a3e828b2787860b6332

image-20240927085503364

完全二叉树特性

完全二叉树实际上-对应的是满二叉树删除叶节点最右边若干个节点得到的

二叉树中至多只有最下边两层节点的读书小于2 ,并且二叉树中任意一个节点的右子树高度为h.则左子树的高度只能是h或h+1,因此高度为h的完全二叉树若按层次从上到下,从左到右自然数编号,它与高度为h的满二叉树中节点的编号一一对应

a6c977d73728864a0eab7b144691e7c2

de3e93b1a8cad0f48552d2c5ec2897b2

n 1是度为1

3.1完全二叉树 父节点 左孩 右孩计算

58572e8e7507955a5d1a96368b707eb6

4.完全二叉树叶子节点计算

image-20241026224328393

满二叉树
2 h~1 4
节点书 7=叶子节点+n2

叶子节点=n2+1 度为2的所有节点+1

7=n2+n2+1=2n=
n=3

image-20241026224822857

偶数情况

image-20241026225050498

6.2.3 二叉树的存储结构

二叉树的顺序存储结构

5485d6355af906601e5a9fd3e33a3b53

双亲就是节点I/2=双亲

b491c0176ee7c01a6a65ddeb325698ce

0cc795511b49146f1acf2603434e87b8

可以先画满的再自己擦除

具有空间浪费
特点总结

5b6b2e941ef139a1373de2bbfdf162aa

二叉树的链式存储结构

ad0feb90a20cbdbbf7e34fd211d3bc93

叶子节点特点-左右都为空
左 数据 右

b02ee522a627db1efaf6e5de7e2f30c5

二叉树特点

c0f72288f4f5a88f2e2f3841557eeab6

—找双亲不方便 可以写三链式表

20f493db431b79d51749bc0800751a2c

存储双亲链

69e06d709b1f95592ac17e6c71cb337a

6.2.4 递归算法设计

1.递归算法了解

image-20240928170946087

递归模型 递归出口-递归的终止条件 递归体 递归求解的递推关系

2.二叉树的递归算法设计

image-20240928171809445

整个递归过程的关键在于,从树的最底层(叶节点)开始计算,每次计算当前节点的值并将结果返回给上一层,最终返回根节点的总和。图中箭头所示就是递归函数从叶节点向上返回的过程。

这个递归实现了树的后序遍历(左子树 -> 右子树 -> 根节点),每个节点都只被访问一次,因此时间复杂度为 O(n),其中 n 是树中节点的总数。

6.4二叉树的基本运算

3a084bee096c8c290d381bafe81ad77e

1.二叉树初始化

通过字符来规范树的结构-读取字符进行处理二叉树

image-20240929091845554

2.销毁二叉树

递归算法-结束条件结束bt==null

de46920865c40f0027f69978f5cf953djhs

3.高度计算

f(bt)=0; bt=null

max(f(bt->lchild),f(bt->rchild))+1;//遍历左右子树-谁高就是谁大

递归代码

递归结束-左右子树都为空

int BThight(BtNode *&bt)

{

int lchildddep,rchildddep;

if(bt =null) return 0;

else

{

image-20240929093243686

}

}

从根节点的左右子树遍历下去-嵌套很深

4.求二叉树个数

dba716586b9766fa6609c8ae656009f9

5.求二叉树叶子节点个数

image-20240929094209725

6.输出二叉树

image-20240929094316839

6.5二叉树的遍历

1.前序

若二叉树不为空 -根->左右

递归算法

1
2
3
4
5
6
void pRi(BtNode*ps)
{
//打印
pRi(ps->lchid);
pRi(ps->light);
}

2f138432e6f5e955d55bd5d98e141654

image-20240929095621970

2.中序

左根右

image-20240929152947372

D

3.后序

左右根

41fbf8580631e99424e120e5ca9a77aa

4.层次遍历

根节点开始-从上向下-同一层从左到右访问节点

image-20241002113334235

算法剖析

895fb13aedccbf010940ab93b8087956

总结

遍历代码

1
2
3
4
5
6
7
8
9
10
11
12
void function(bt )

{
if(bt !=null)
{
//左子树递归

//右子树递归

}

}

前序-中序-后续-的打印结束根据名字来定-考场如果立马思考还是需要时间的

其实依照打印顺序递归也是好想的

序名字-就是根的位置 根左右 左根右 左右 根

6.6二叉树与树的转换

e7d9e0739061552757808aec6378120f

树转换二叉树

622b4d4f245461d8be3ca14d6e3b15dd

完整步骤-下面是取巧方法

5b4b9c524156637cc996abcffb0d8b42

二叉树-孩子兄弟表示法来表示

cf66ae5f78081ceed0bbcd68108269f0

801021d1130c2d06689ee6fd40df4363

串糖葫芦就是右指针串

c3b15ecc621f90209999ae47cc50ff1e

32fabb4a65cd7c2321c855138a7fd4a5

森林转二叉树

ps:基本不变-就是根节点线串完后-依次遍历每个节点下的数据

b0f7ad89c2a69e255c33462ca40776a1

二叉树转树

1.过程转换

807d51501d1fe2e9a0df54469e5c575b

A->B右节点有节点-把整个右节点拆下来-同级

e1b66ba68902f52be920db26447511ba

层次顺序恢复

二叉树转森林

41d4761d60810b7afa9adc41a32d04d2

fa16db114f3f3a7b83aa5fcff23d87c3

小结

14c21c3116f7006f21055379645b964a

注意-简化二叉树下-什么是树-什么是森林

6.7 哈夫曼树

883c38cc630cab12b5a3220fd7a6e13f

带权路径长度

84dfcde5443298f385743c0a30c4b59b

树的带权路径长度

ba23ebc2fc457072454df04454a73599

*叶子节点的权值-根节点到达叶子经过的边数-之和

哈夫曼树的定义-构造

c230d613341cbbe8987c5d8c24c0c64f

哈夫曼树的构造

79037578c43a7b2a4214a3b77a73db78

232fd0bc9072a29e517862fa4728481f

将最小和的叶子节点结合-会生成新的节点-其中-必须是叶子节点

哈夫曼树的编码

dd09b925000470bf88be7e398862b5ed

1807433cf1f909098a45132e719e9dc9

0a54437e61b3c0679bfc274267c4ce02

2.重新规范ABCD编码

23e2f727ac1a7378b3e3eb6f7913b2f8

前缀编码

dd74ab00537f2ddbf29be1294321dd55

35ed23fa61ff32a789b564424a8a7fbc

总结

ff3d2e49788f93e7b2171b2b6cffdfdf


数据结构-树和二叉树
http://example.com/2024/09/28/data structure/树和二叉树/
作者
John Doe
发布于
2024年9月28日
许可协议