分享一下我老师大神的人工智能教程!零基础,通俗易懂!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. 数据结构:完全二叉树开胃菜小练习

    目录 一.前言 二.完全二叉树的重要结构特点 三.完全二叉树开胃菜小练习 1.一个重要的数学结论 2.简单的小练习 一.前言 关于树及完全二叉树的基础概念(及树结点编号规则)参见:http://t.c ...

  2. 常见数据结构——完全二叉树(定义、特征、节点个数的判断以及C++简单实现)

    完全二叉树 完全二叉树 1.定义 2.特征 3.C++简单实现完全二叉树的节点个数 完全二叉树 1.定义 完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1 ...

  3. 数据结构完全二叉树性质

    完全二叉树 若二叉树左子树高度-右子树高度小于等于1且大于等于0则称该二叉树为完全二叉树. 二叉树一般性质: 性质1:二叉树第i层上的结点数目最多为2i−1(i≥1)2^{i-1}(i \geq 1) ...

  4. 数据结构与算法系列——从菜鸟到入门

    持续更新系列. 参考自:<数据结构与算法分析--Java语言描述>.<算法导论> 排序 数据结构--快速排序 数据结构--堆排序 数据结构--归并排序 数据结构--计数排序 数 ...

  5. 【c语言数据结构】二叉树

    c语言数据结构完全二叉树 快速开始 直接参考示例代码即可 介绍 概念 二叉树(Binary tree)是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单 ...

  6. 数据结构与算法之完全二叉树的节点个数

    数据结构与算法之完全二叉树的节点个数 目录 数据结构与算法之完全二叉树的节点个数 1. 数据结构与算法之完全二叉树的节点个数 (一)思路 先遍历左边界获得树的高度h 遍历右子树的左边界,看看到没到最后 ...

  7. 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树

    数据结构与算法之判断一棵树是否为搜索二叉树.判断一棵树是否是完全二叉树 目录 判断一棵树是否为搜索二叉树 判断一棵树是否是完全二叉树 1. 判断一棵树是否为搜索二叉树 概念:搜索树就是中序遍历的结果是 ...

  8. 判断是否是完全二叉树_【数据结构】二叉树高频考试题目【代码模板】!

    本文来自公众号程序员小乐(study_tech) 作者:IOExceptioner 编辑:www.jianshu.com/p/0190985635eb 先上二叉树的数据结构: class TreeNo ...

  9. 数据结构与算法(八)-二叉树(斜二叉树、满二叉树、完全二叉树、线索二叉树)...

    前言:前面了解了树的概念和基本的存储结构类型及树的分类,而在树中应用最广泛的种类是二叉树 一.简介 在树型结构中,如果每个父节点只有两个子节点,那么这样的树被称为二叉树(Binary tree).其中 ...

最新文章

  1. mysql导入数据,涉及到时间转换,乱码问题解决
  2. 关于maven依赖中的scopeprovided/scope使用
  3. C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载
  4. Java常见GC算法_垃圾收集器及内存分配_G1垃圾收集器
  5. log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory). log4j:WARN
  6. 20145236《网络对抗》进阶实验——64位Ubuntu 17.10.1 ROP攻击
  7. js高级(类和对象)
  8. 强化学习工具Horizon开源:Facebook曾用它优化在线视频和聊天软件
  9. 安装pytest时遇到的问题及解决方案
  10. 51nod-1350:斐波那契表示
  11. python字典的基本操作编程_Python入门教程5. 字典基本操作【定义、运算、常用函数】 原创...
  12. 快速开发平台如何应用
  13. lbj学习日记02 循环结构(for while)
  14. 前端开发人员必备的十项技能
  15. csgo为什么显示vac无法连接服务器,csgovac无法验证您的游戏会话怎么办 看完你就知道了...
  16. .Net使用DES解密发生“数据不正确”的错误
  17. HP3055提示 soanner bulb warming up
  18. Python 数据挖掘(三) matplotlib模块 简单使用
  19. SpringBoot集成 Windows2012 AD 认证服务
  20. 欧尼酱讲JVM(18)——对象实例化内存布局与访问定位

热门文章

  1. C#获取网页中的验证码图片(转载)
  2. 如何在Python上用jieba库分析TXT文件的词频
  3. 一文带你深入拆解Java虚拟机
  4. poj3617 贪心
  5. MySQL federated 引擎跨服务器使用实例
  6. keyCode(ASCII)与键盘按键对照表
  7. VMware三种网络模式根本区别(图)
  8. linux centos yum 报错 one of the configured repositories failed 解决方法
  9. linux sshpass 非交互的ssh密码验证 简介
  10. SAP 企业管理软件与解决方案 产品简介