数据结构——树

每个宝宝的头上都只有一根天线 

数据结构——树_第1张图片

树的高度:4(默认从1开始算)

D节点的度:3

这棵树的度:3 

数据结构——树_第2张图片

数据结构——树_第3张图片

3棵树组成一个森林

相互转换是重点

数据结构——树_第4张图片

树的度:最大的那个节点的度为3

m叉树:每个节点最多有m个孩子 0 1 2 3 ...m

数据结构——树_第5张图片

比如二叉树:

数据结构——树_第6张图片

数据结构——树_第7张图片

数据结构——树_第8张图片

数据结构——树_第9张图片

数据结构——树_第10张图片

完全二叉树:只有叶子节点的右边能缺少,其余和满二叉树一模一样 

最多只有一个度为1的节点

4也重要

数据结构——树_第11张图片

你想插入68其实很简单,只要从根开始对比关键字,大了就往右走,小了就往左走

数据结构——树_第12张图片

希望你长胖而不是长高,这样对比关键词的次数就会减少,别走那么深吗,受不了啊

任何一个节点的左右子树的高度之差不超过1

数据结构——树_第13张图片

顺序存储只适合存储完全二叉树 

数据结构——树_第14张图片

左孩子2i 右孩子2i+1

i的父节点:i/2向下取整 

i所在层次:[log2n] +1也是向下取整

数据结构——树_第15张图片

普通二叉树

判断左孩子只能通过isempty字段

也都要按照满二叉树的标准来分配存储空间

数据结构——树_第16张图片

数据结构——树_第17张图片

因此引出了二叉树的链式存储:

一共有n+1个空链域,可用于构造线索二叉树 

这里重点解释一下为什么是n+1个空炼狱:在一棵二叉树当中,除了根节点之外,每个天线宝宝头上都只有一根天线(每个天线消耗一个指针),一共使用了n-1个指针,所以还剩2n-(n-1)=n+1个空炼狱

数据结构——树_第18张图片

二叉树的链式存储

大多情况其实是使用的链式存储,插入根节点的时候只要初始化根即可,后面加入新的节点就再malloc即可

数据结构——树_第19张图片

子节点好找,但是父节点镇TM难找啊!!! 

方便找父节点:三叉链表

 数据结构——树_第20张图片数据结构——树_第21张图片数据结构——树_第22张图片

多练几遍呗 

数据结构——树_第23张图片数据结构——树_第24张图片

数据结构——树_第25张图片

代码实现二叉树的先序中序后序遍历

visit访问的代码放在前面就是先序遍历,放到中间就是中序遍历,放到后面就是后序遍历

空间复杂度:O(h)        与高度有关

数据结构——树_第26张图片

先序第一次碰到的就是喽,其余的使用前面的方法吧

数据结构——树_第27张图片

求树的高度

分别递归遍历左右子树的高度取其最大值为树高

数据结构——树_第28张图片

每访问一个节点就把它的左右孩子依次入队,同时根节点出队

数据结构——树_第29张图片

使用链队列        代码实现:

数据结构——树_第30张图片

数据结构——树_第31张图片

数据结构——树_第32张图片最终结果:注意验证!

 数据结构——树_第33张图片

首先由先序/后续/层次遍历确定根节点的位置,然后根据中序遍历序列确定左右

结果和上面的一样的嘿嘿

数据结构——树_第34张图片

数据结构——树_第35张图片

数据结构——树_第36张图片

普通二叉树的缺陷:只能从根开始遍历,我从第二个元素开始都不刑 

找到中序遍历序列的前驱和后继节点讲实话蛮麻烦的

以下是访问前驱后继的步骤:在visit当中添加操作,一般要从根节点来从头进行中序遍历等等

数据结构——树_第37张图片

中序线索二叉树:

数据结构——树_第38张图片

术语:二叉链表 

数据结构——树_第39张图片

数据结构——树_第40张图片 数据结构——树_第41张图片

数据结构——树_第42张图片建立线索二叉树的目的就是为了方便地找它的前驱和后继:

最左下角的这个节点就是p的后继节点

数据结构——树_第43张图片

只有中序线索二叉树才能同时找到前驱和后继 

数据结构——树_第44张图片

普通的树应该设计什么样的数据结构来存储它呢? 

数据结构——树_第45张图片

 使用二叉链表来存储树可以方便地进行二叉树和树之间的转换

只不过它的指针是*firstchild和*nextsibling,即左孩子是第一个孩子,右孩子是兄弟

 数据结构——树_第46张图片

树和二叉树的相互转换:

数据结构——树_第47张图片 数据结构——树_第48张图片

森林和二叉树的相互转换 

数据结构——树_第49张图片

数据结构——树_第50张图片 数据结构——树_第51张图片

哈夫曼树

数据结构——树_第52张图片

数据结构——树_第53张图片

数据结构——树_第54张图片

方法二:

数据结构——树_第55张图片 思考:有没有更好的编码方案呢?

数据结构——树_第56张图片

数据结构——树_第57张图片

数据结构——树_第58张图片

哈夫曼编码可以用于数据的压缩

数据结构——树_第59张图片

数据结构——树_第60张图片

我一路向北,判断是不是同一个爹地

数据结构——树_第61张图片

并查集就两个操作一个是查一个是并

数据结构——树_第62张图片

使用双亲表示法来实现并查集那是相当滴容易啊,只要修改指向就辽

数据结构——树_第63张图片

使用一个数组就可以表示他们之间的集合关系 

数据结构——树_第64张图片

集合初始化代码:

数据结构——树_第65张图片

并和查的代码实现:

注意:这里的x指的是下标

数据结构——树_第66张图片

合并的时候把小树合并到大树上面,就不会增加树的高度h了

使用根节点的绝对值来表示树的高度(-2 -3 -5 -7 -8这样子)

数据结构——树_第67张图片

最终结果:

数据结构——树_第68张图片

你可能感兴趣的:(数据结构)