几种常用树的概念
1.完全二叉树
完全二叉树:
//根节点 1
//第二层 2 3
//第三层 4 5 6 7
//第四层 8. 9 10........
很明显,每层的节点之间都是没有间隙的,
堆(大顶堆、小顶堆)都是属于很特殊的数据结构,可以用完全二叉树来进行存储,而完全二叉树又可以很完美得与数组进行匹配,跟节点与叶子节点之间的关系也是很好表示
堆的主要核心方法有:
insert() //插在heap 数组的最后一位,然后用size记录最后一位的位置 然后跟自己的父节点进行比较大小 调换位置
delete() //删除堆顶的元素, 然后将size下标的元素移到根节点,然后与子节点进行比较 然后调换位置
isEmpty() //判断一个堆是否为空
isFull() //当size = capcity.length-1 时 堆满了 ;
2.完美二叉树
完美二叉树,除了叶子节点,所有节点的左右节点均不为空,即
1
2. 3
4 5 6. 7
.....................
3.斜二叉树
根节点的左子树或者右子树有一个为null;
1
2
3
4
5
4.平衡二叉树
平衡二叉树
h(left)- h(right) <=1 这里的【平衡因子】为1 这里的h是高度 ,也就是子树的深度-1
nh代表h高度的平衡二叉树的最少节点数 nh = nh-1 + nh-2 +(1)
也就是左儿子的最少节点数+右儿子最少节点数+1;
例如n0 = 1 ;
n1 = 2
n2 = 2+1+1 = 4
n3 = 4+2+1 = 7
n4 = 7+4+1 = 12s 时间复杂度(O(log2 n))
4种旋转调整:
RR 插入节点在被破坏节点的 右子树的 右子树上
LL 插入节点在被破坏节点的 左子树的 左子树上
LR 插入节点在被破坏节点的 左子树的 右子树上
RL 插入节点在被破坏节点的 右子树的 左子树上
5.二叉搜索树
二叉搜索树,主要是用来搜索树中的元素,主要属性有:
为了满足查询的速度,保证左 < 根 < 右 ,所以在二叉搜索中中,所有根节点左边的数据 always < 右边
1.data 节点存储的数据
2.lNode。左子树的根节点
3.rNode。右子树的根节点
主要方法有:
1.find(Node node,Object data) 从树中搜索指定数据的节点
2.delete(Node node,Object data) 从树中删除指定数据的节点
3.insert(Node node,Object data) 创建一个树的根节点或者向一个树中插入指定数据的节点
6.哈夫曼树
* 哈夫曼树:也叫最优二叉树,是一颗搜索树(!!!并不一定是堆,因为堆是完全二叉树,而哈夫曼树是二叉树,并不一定是完全二叉树)
* 应用场景:解决不同权重的数据实现不等长编码存储的问题,减少存储空间
* 结构如下:
* WPL:树的带权路径长度 每个叶节点的(weight*到root节点的距离) 的总和 ,WPL越小,树越优
* 避免二义性 :只要任意一个节点的编码不是另外一个节点编码的前缀就ok! 错误(a 10 b 1) 正确(a 10 b 01)
* 假如使用二叉树来存储 ,只要保证所有存储的字符 都在树的叶子节点上就好
* <p>
* 如何构建一个哈夫曼树: 哈夫曼树除了叶子节点,每个节点的左右不可能为空
* n0 = (n+1)/2 n0为叶子节点的个数 n为节点总个数
* {1,3,6,8,12,20}->1,3 -> 4(形成一个树) -> 4,6->10 ->10,8->18 18,12 -> 30 30,20 ->50
* 每次将2个最小权重的节点,形成一个哈夫曼树 ,然后权重相加形成跟节点 ,放进序列 ,以此类推
树的常用术语
节点:树由多个节点单元组成
节点的度:节点下面的子树的个数
树的度:最大节点的度
树深度:节点的最大层次
斜二叉树
满二叉树(完美二叉树)
完全二叉树
n0 = n2+1 (n0代表叶节点个数 n2代表有2个儿子节点的个数,n1代表有一个儿子节点的个数)
n0+n1+n2 -1(所有的边,节点总个数-1) = n0*0+n1*1+n2*2(从上往下看,每个节点创造的边条数)
=>n0-1=n2 =>n0 = n2+1
二叉树:
每层最多有2^i-1个节点数
ASL(平均查找次数) = 1*节点个数+2*节点个数+3*当层节点个数/总节点个数 该树为3层
查找树类似于二分查找,可以实现动态查找,可插入可删除!!!!!!!!!!!!!!!!!!!
二叉树的操作
{
isEmpty()是否为空
createATree() 创建一个树
traversal()遍历 先序(根左右) 中序(左根右) 后序(左右根) 层序遍历
}
完全二叉树(堆)可以用 数组来实现 ,首先将节点从上往下,从左往右一次编号 ,分别存入数组的对应编号的下标
A B C D E F G
1 2 3 4 5 6 7