二叉树

定义

二叉树要么为空,要么由根结点、左子树和右子树组成,而左子树和右子树分别是一棵二叉树。 下面这棵树就是一棵二叉树。
二叉树

满二叉树

如果二叉树中每个内部结点都有两个儿子,这样的二叉树叫做满二叉树。或者说满二叉树所有的叶结点都有同样的深度。比如下面这棵二叉树,是不是感觉很“丰满”。满二叉树的严格的定义是一棵深度为h且有2h-1个结点的二叉树。
满二叉树

完全二叉树

如果一棵二叉树除了最右边位置上一个或者几个叶结点缺少外其它是丰满的,那么这样的二叉树就是完全二叉树。严格的定义是:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层从右向左连续缺若干结点,就是完全二叉树。也就是说如果一个结点有右子结点,那么它一定也有左子结点。例如下面这三棵树都是完全二叉树。 完全二叉树的最典型应用就是:堆
在这里插入图片描述在这里插入图片描述在这里插入图片描述
其实完全二叉树类似下面这个形状。
在这里插入图片描述

说到这里我们马上就要领略到完全二叉树的魅力了。先想一想一棵完全二叉树如何存储呢?其实完全二叉树中父亲和儿子之间有着神奇的规律,我们只需用一个一维数组就可以存储完全二叉树。首先将完全二叉树进行从上到下,从左到右编号。
在这里插入图片描述

通过上图我们发现如果完全二叉树的一个父结点编号为k,那么它左儿子的编号就是2k,右儿子的编号就是2k+1。如果已知儿子(左儿子或右儿子)的编号是x,那么它父结点的编号就是x/2,注意这里只取商的整数部分。在C语言中如果除号‘/’两边都是整数的话,那么商也只有整数部分(即自动向下取整),即4/2和5/2都是2。另外如果一棵完全二叉树有N个结点,那么这个完全二叉树的高度为log2 N简写为log N,即最多有log N层结点。

二叉查找树/二叉排序树

满足一下特性:
1.非叶子节点最多拥有2个子节点
2.非叶子节点值大于左边子节点、小于右边子节点
3.没有值相等重复的节点
二叉查找树
它的查找时间复杂度为O(logN),当然也存在最差的情况,比如下图,查找的时间复杂度为O(N),跟顺序查找效率一样
在这里插入图片描述

二叉平衡树

在二叉查找树的基础上,又增加了如下的约定:

树的左右两边层级数相差不超过1

平衡二叉树的查找效率很快,但是维护一颗平衡二叉树的代价是非常大的,需要1次或者多次的左旋和右旋来得到插入或更新后的平衡性。举例:

初始平衡二叉树
平衡二叉树

插入元素0003
在这里插入图片描述
对元素0005进行右旋(将元素0005变为右子节点):
在这里插入图片描述
对元素0002进行左旋(将元素0002变为左子节点):
在这里插入图片描述

最终得到一个平衡二叉树

参考:
http://blog.51cto.com/ahalei/1414035
http://wiki.jikexueyuan.com/project/easy-learn-algorithm/amazing-priority-array.html
https://mp.weixin.qq.com/s?__biz=MzIxMzk3Mjg5MQ==&mid=2247483916&idx=1&sn=bfc33b53f8176e6f4d7e64c087ad36a4&chksm=97afe0f8a0d869eeaa14d8b26eca9d6fa09f9fda4557b40cb22ebe75851aa4dfb67d822233d9&scene=0&subscene=90&sessionid=1539434820&ascene=7&devicetype=andro

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值