一、有序二叉树
又称二叉排序树、二叉搜索树、二叉查找树
左子树的数据小于根的数据,右子树的数据大于等于根的数据,这种树称为有序二叉树
有序二叉树中的中序遍历的结果是从小到大排序,因此有序二叉树也可以是一种排序算法
并且对有序二叉树的查找天然是二分查找,所以有序二叉树经常考
注意:需要会根据插入的数据,还原一棵有序二叉树
二、线索二叉树
规律:在有n个节点的链式二叉树中,必定存在n+1个空指针域
在链式二叉树中有很多没被使用的空指针,会造成一定的浪费
在有序二叉树中,可以让这些空指针指向下一个\前一个节点,这种树称为线索二叉树
在线索二叉树中,以中序遍历树时,可以不用递归而是通过循环即可,从而提高遍历树的效率、节约内存
中序线索二叉树节点数据项:
数据
左子树指针
右子树指针
右子树是否是线索标志(为真:右子树线索 为假:右子树不是线索)
实现线索二叉树的过程:
1、生成得到一颗普通的有序二叉树
2、按照中序遍历整棵树进行创建线索
3、按照线索循环遍历线索二叉树
三、选择树(胜者树、败者树)
是一种完全二叉树,把待比较的数据存储在最后一层,根节点是左右子树中的其中一个,是他们的最大或最小值,不停地比较形成一棵选择树
作用:能快速地找出最大值或最小值,如果带比较数据有部分更新,重新选择的速度也很快
四、堆 heap
是一种完全二叉树,不适合使用链式存储,适合用顺序存储
大顶堆(大根堆):
根节点比左右子树大
小顶堆(小根堆):
根节点比左右子树小
数据项:
存储数据的内存首地址
容量
数量
操作:
创建、添加、删除、空堆、满堆、堆顶
五、哈夫曼树\霍夫曼树
基本概念:
路径长度:从一个节点开始到另一个节点之间的路径条目数
根节点到第L层上的任意节点的路径长度L-1
树的路径长度:从根节点出发到每个节点的路径长度之和
节点的权:将树中的节点额外赋予某种含义的数值,该数值就称为节点的权
节点的带权路径长度:从根节点出发到该节点之间的路径长度与该节点权的乘积
树的带权路径长度:所有叶子节点的带权路径长度之和,简称WPL
WPL是衡量一棵带权二叉树优劣的关键
示例:
成绩 <60 60~69 70~79 80~89 90~100
评级 E D C B A
比例 5% 15% 40% 30% 10%
普通的带权二叉树的
WPL=10+30*2+40*3+15*4+5*4 = 270
经过优化后的带权二叉树的
WPL=40+30*2+15*3+10*4+5*4 = 205
哈夫曼树是一棵带权二叉树且它的WPL最小
构建一棵哈夫曼树:
1、把n个带权节点存入集合F中,每个节点左右子树置空
2、从F中选取根节点的权值最小的两个节点,作为左右子树构建成一棵新的二叉树,把左右子树的权值之和作为该树的根节点的权值
3、从F中删除刚刚选择的两个节点,把新得到的二叉树放入F中
4、重复第2、3步骤,直到F中只剩下一棵树,便是哈夫曼树
WPL=40+30*2+15*3+10*4+5*4 = 205
六、哈夫曼编码
目的:当年是为了解决远距离通信时传输数据的最优解问题
待发送文字:ABCAA EEDFB
方法1:转成二进制发送
A 000 B 001 C010 D011 E100 F101
总共要发送30个0\1
方法2:
1、根据待发送文字的频率,构建一棵哈夫曼树
假设频率:A27 B8 C15 D15 E30 F5
2、设置哈夫曼树的左分支为0、右分支为1,从根节点出发到每个叶子节点经过的路径分支组成的0\1的编码就是所谓的哈夫曼编码
A 01 B 1001 C 101 D 00 E 11 F 1000
011001101010111110010001001
作用:数据、文件压缩的一种方式
关于二叉树的常考笔试、面试题:
1、把一棵二叉树转换成它的镜像树
2、输入两颗二叉树A、B,判断B是否是A的子结构(NULL不是任何树的子结构)
3、把一棵有序二叉树转换成一个有序的双向链表
4、找出有序二叉树中的第k大的数据是多少
5、判断一棵二叉树是否对称(镜像)
6、实现之字形遍历一棵树,第一层按照从左往右顺序遍历,第二层从右往左遍历,第三层又从左往右遍历,依次变化