几种常用树的概念

几种常用树的概念

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值