数据结构 - 完全二叉树
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
完全二叉树是一种效率很高的数据结构,堆就是一种完全二叉树,所以效率极高。像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化;几乎每次都要考到的二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。
完全二叉树定义 完全二叉树(Complete Binary Tree)
若设二叉树的高度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,且第h层所有的节点都连续集中在最左边,这就是完全二叉树。
完全二叉树是由满二叉树而引出来的。对于深度为K,有N个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
若一棵二叉树至多只有最下面两层的结点的度数可以小于2,并且最下层的结点都集中在该层最左边的若干位置上,则此二叉树为完全二叉树。
完全二叉树特点
叶子结点只可能在最下面的两层上出现,对任意结点,若其右分支下的子孙最大层次为L,则其左分支下的子孙的最大层次必为L或L+1;
出于简便起见,完全二叉树通常采用数组而不是链表存储,其存储结构如下:
var tree : array[1..n] of longint; {n:integer; n>=1}
对于tree,有如下特点:
(1)若i为奇数且i>1,那么tree[i]的左兄弟为tree[i-1];
(2)若i为偶数且i<n,那么tree[i]的右兄弟为tree[i+1];
(3)若i>1,tree[i]的双亲为tree[i div 2];
(4)若2*i<=n,那么tree[i]的左孩子为tree[2*i];若2*i+1<=n,那么tree[i]的右孩子为tree[2*i+1];
(5)若i>n/2,那么tree[i]为叶子结点(对应于(3));
(6)若i<(n-1)/2,那么tree必有两个孩子(对应于(4));
(7)满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树;
(8)完全二叉树第i层至多有2i-1个节点,共i层的完全二叉树最多有2i-1个节点。
完全二叉树叶子结点数的算法
可以根据公式进行推导,假设n0是度为0的结点总数(即叶子结点数),n1是度为1的结点总数,n2是度为2的结点总数,由二叉树的性质可知:n0=n2+1,而n=n0+n1+n2(其中n为完全二叉树的结点总数),由上述公式把n2消去得:n=2n0+n1-1,由于完全二叉树中度为1的结点数只有两种可能0或1,由此得到n0=(n+1)/2或n0=n/2,就可根据完全二叉树的结点总数计算出叶子结点数。
完全二叉树的性质
具有n个结点的完全二叉树的深度为floor(log2n)+1或ceil(log2(n+1))。
证明:设所求完全二叉树的深度为k。
由完全二叉树定义可得:
深度为k得完全二叉树的前k-1层是深度为k-1的满二叉树,一共有2k-1-1个结点。
由于完全二叉树深度为k,故第k层上还有若干个结点,因此该完全二叉树的结点个数:n>2k-1-1。
由二叉树的性质可知:n≤2k-1,即:2k-1-1<n≤2k-1
由此可推出:2k-1≤n<2k,取对数后有:k-1≤lgn<k
由于k-1和k是相邻的两个整数,故有k-1=floor(log2n),由此即得:k=floor(log2n)+1。
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
数据结构 - 完全二叉树相关推荐
- 数据结构:完全二叉树开胃菜小练习
目录 一.前言 二.完全二叉树的重要结构特点 三.完全二叉树开胃菜小练习 1.一个重要的数学结论 2.简单的小练习 一.前言 关于树及完全二叉树的基础概念(及树结点编号规则)参见:http://t.c ...
- 常见数据结构——完全二叉树(定义、特征、节点个数的判断以及C++简单实现)
完全二叉树 完全二叉树 1.定义 2.特征 3.C++简单实现完全二叉树的节点个数 完全二叉树 1.定义 完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1 ...
- 数据结构完全二叉树性质
完全二叉树 若二叉树左子树高度-右子树高度小于等于1且大于等于0则称该二叉树为完全二叉树. 二叉树一般性质: 性质1:二叉树第i层上的结点数目最多为2i−1(i≥1)2^{i-1}(i \geq 1) ...
- 数据结构与算法系列——从菜鸟到入门
持续更新系列. 参考自:<数据结构与算法分析--Java语言描述>.<算法导论> 排序 数据结构--快速排序 数据结构--堆排序 数据结构--归并排序 数据结构--计数排序 数 ...
- 【c语言数据结构】二叉树
c语言数据结构完全二叉树 快速开始 直接参考示例代码即可 介绍 概念 二叉树(Binary tree)是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单 ...
- 数据结构与算法之完全二叉树的节点个数
数据结构与算法之完全二叉树的节点个数 目录 数据结构与算法之完全二叉树的节点个数 1. 数据结构与算法之完全二叉树的节点个数 (一)思路 先遍历左边界获得树的高度h 遍历右子树的左边界,看看到没到最后 ...
- 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树
数据结构与算法之判断一棵树是否为搜索二叉树.判断一棵树是否是完全二叉树 目录 判断一棵树是否为搜索二叉树 判断一棵树是否是完全二叉树 1. 判断一棵树是否为搜索二叉树 概念:搜索树就是中序遍历的结果是 ...
- 判断是否是完全二叉树_【数据结构】二叉树高频考试题目【代码模板】!
本文来自公众号程序员小乐(study_tech) 作者:IOExceptioner 编辑:www.jianshu.com/p/0190985635eb 先上二叉树的数据结构: class TreeNo ...
- 数据结构与算法(八)-二叉树(斜二叉树、满二叉树、完全二叉树、线索二叉树)...
前言:前面了解了树的概念和基本的存储结构类型及树的分类,而在树中应用最广泛的种类是二叉树 一.简介 在树型结构中,如果每个父节点只有两个子节点,那么这样的树被称为二叉树(Binary tree).其中 ...
最新文章
- mysql导入数据,涉及到时间转换,乱码问题解决
- 关于maven依赖中的scopeprovided/scope使用
- C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载
- Java常见GC算法_垃圾收集器及内存分配_G1垃圾收集器
- log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory). log4j:WARN
- 20145236《网络对抗》进阶实验——64位Ubuntu 17.10.1 ROP攻击
- js高级(类和对象)
- 强化学习工具Horizon开源:Facebook曾用它优化在线视频和聊天软件
- 安装pytest时遇到的问题及解决方案
- 51nod-1350:斐波那契表示
- python字典的基本操作编程_Python入门教程5. 字典基本操作【定义、运算、常用函数】 原创...
- 快速开发平台如何应用
- lbj学习日记02 循环结构(for while)
- 前端开发人员必备的十项技能
- csgo为什么显示vac无法连接服务器,csgovac无法验证您的游戏会话怎么办 看完你就知道了...
- .Net使用DES解密发生“数据不正确”的错误
- HP3055提示 soanner bulb warming up
- Python 数据挖掘(三) matplotlib模块 简单使用
- SpringBoot集成 Windows2012 AD 认证服务
- 欧尼酱讲JVM(18)——对象实例化内存布局与访问定位