之所以会出现完全二叉树的概念,是因为可由此在物理上,以线性表的方式实现逻辑上的完全二叉树

  • 完全二叉树的叶子节点只能出现在最底部两层;

1. 完全二叉树

对于一棵高度为 hh 的二叉树,如果其第 00 层至 h−1h-1 层(倒数第二层)都是满的,也就是说,对所有 0≤i≤h−10\leq i \leq h-1,第 ii 层有 2i2^i 个结点,前 h−1h-1 层的结点总数为 2h−12^h-1。如果最下一层的结点不满,则所有结点从最左边开始连续排列。这样的二叉树就是一棵完全二叉树。

2. 完全二叉树的性质

我自己得到的一些结论如下:

  • 从 0 开始编号,编号为奇数的必定在左子节点,编号为偶数的必定在右子节点;
  • 对某一个内部结点(internal node)而言,不可能出现有右子节点,而没有左子节点的情况;
  • 完全二叉树与线性结构有自然的双向映射;
  • nn 个结点的完全二叉树的叶节点的范围是 n2∼n\frac n2\sim n
    • 也即对完全二叉树而言,(后)一半是叶节点,(前)一半是内部结点(包括根节点)
  • nn 个结点的完全二叉树高度为 ⌊log2n⌋\left\lfloor\log_2n\right\rfloor

    证,设完全二叉树 TT 包含 nn 个结点,高度是 hh。则 nn 与 hh 的关系为:

    2h−1<n≤2h+1−1

    2^h-1\lt n\leq 2^{h+1}-1

    也即 2h≤n<2h+12^h\leq n\lt 2^{h+1},两边同时取对数得 h≤log2n<h+1h\leq \log_2n\lt h+1 。可见 hh 为不大于 log2n\log_2 n 的最大整数;

  • (完全二叉树)如果 nn 个结点的完全二叉树的结点按层次并按从左到右的顺序从 0 开始编号,对任一节点 ii(0≤i≤n−10\leq i\leq n-1)都有:

    • 序号为 0 的结点是根节点;
    • 对于 i>0i\gt 0,其父节点的编号为 i−12\frac{i-1}2;
    • 对于 2×i+1<n2\times i+1\lt n,其左子节点序号为 2×i+12\times i+1,否则无左子节点;
    • 对于 2×i+2<n2\times i+2\lt n,其左子节点序号为 2×i+22\times i+2,否则无右子节点;

    证明如下,使用数学归纳法,

    • i⇒i−12i ⇒ \frac{i-1}2 ⇒ i+1⇒i2i+1⇒ \frac{i}2

      • 证:当 ii 为左节点时,i+1i+1 为其父节点的右结点,也即 i+1i+1 与 ii 为同一父节点的兄弟节点,此时 i2\frac i2 与 i−12\frac{i-1}2 相等,因为要取整数
      • 当 ii 为右结点时(ii 为偶数), 则 i+1i+1 结点的父节点为 i−12+1\frac{i-1}2+1,
    • i⇒2×i+1i ⇒ 2\times i+1 ⇒ i+1⇒2×i+3i+1⇒ 2\times i+3

      同样,分 ii 为左节点和右节点,进行证明,

      • 左节点时,i+1i+1 为其兄弟节点,显然其左子节点为 2i+32i+3
      • 右节点时,根据推算,i+1i+1(与 2i+12i+1、2i+22i+2 在同一层) 结点的左子节点为 2i+32i+3
    • 完全二叉树的一个重要特性,如上证明,它可以十分方便地存入一个表或数组,直接根据元素下标(index)就能找到下标对应结点的子节点或父节点,无须以其他方式记录树的结构信息。

      • 如果第 ii 层是满的,也即第 ii 层有 2i2^{i} 个结点;根的下标是 0,第 ii 层元素从 2i−12^{i}-1 的位置开始存放,连续 2i2^i 个元素都属于这一层;

从二叉树到完全二叉树相关推荐

  1. 数据结构-二叉树、完全二叉树、森林等(基础讲解)

    1.基本术语: 度:有两种度"结点的度"与"树的度".结点的度指的是一个结点子树的个数:树的度是指树中结点度的最大值. 叶子结点:指的是没有子树的结点. 层:树 ...

  2. 算法练习day11——190329(平衡二叉树、搜索二叉树、完全二叉树)

    1.平衡二叉树 判断一棵树是否为平衡二叉树 1.1 分析 首先需要得到一个节点的以下四个信息: 左子树是否平衡: 右子树是否平衡: 左子树的高度: 右子树的高度. 接着,设计递归: 应该返回以此节点为 ...

  3. 牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案

    牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案 题解: 搜索二叉树满足以下性质: 1.非空左子树的所以键值小于其根节点的键值 2.非空右子树的所有键值大于其根节点的键值 ...

  4. 树-二叉树、满二叉树和完全二叉树

    树-二叉树.满二叉树和完全二叉树 二叉树的定义: (1)当n=0时,为空树: (2)当n>0时,是由一个根结点和称为根结点的左.右子树构成,并且两颗子树互不相交. 满二叉树: 对于一棵二叉树,如 ...

  5. b+树时间复杂度_满二叉树、完全二叉树、二叉搜索树、平衡二叉树

    "存在即合理"为什么需要每种树,本文不再冗余的总结每种树太多性质,就说重点. 二叉树(Binary Tree)主要包括:满二叉树.完全二叉树.二叉搜索树.平衡二叉树 性质太多,定义 ...

  6. 《恋上数据结构第1季》二叉树基础、真二叉树、满二叉树、完全二叉树、二叉树的遍历(重点)

    二叉树(Binary Tree) 树(Tree)的基本概念 有序树.无序树.森林 二叉树(Binary Tree) 二叉树的性质 真二叉树(Proper Binary Tree) 满二叉树(Full ...

  7. 满二叉树与完全二叉树入门

    满二叉树 满足以下两个条件,缺一不可 1 所有分支结点都有左子树和右子树; 2 所有叶子结点在同一层上 如图所示,(a)图就是一棵满二叉树,(b)图则不是满二叉树,因为该二叉树的D,F,G,H,I叶子 ...

  8. 二叉树、满二叉树、完全二叉树、平衡二叉树、二叉排序树、线索二叉树

    树的相关概念和性质 度 遍历 哈夫曼树 名称 概念 相关性质 二叉树 树的节点的子节点不超过两个 不存在度大于2的节点 满二叉树 每一层的节点数都达到最大值 节点的度要么为0要么为2 完全二叉树 除最 ...

  9. 数据结构:满二叉树,完全二叉树,非完全二叉树 的区别

    数据结构:满二叉树,完全二叉树,非完全二叉树 的区别 前言 一.满二叉树 二.完全二叉树 三.非完全二叉树 总结 版权声明 前言 记录下满二叉树,完全二叉树,非完全二叉树的区别 一.满二叉树 如上图所 ...

  10. 二叉树-满二叉树、完全二叉树

    二叉树-满二叉树.完全二叉树 满二叉树 一棵高度为h,并且含有 2 h − 1 2^{h}-1 2h−1个结点的二叉树称为满二叉树,即树中的每一层都含有最多的结点.满二叉树的叶子节点都集中在二叉树的最 ...

最新文章

  1. 双绞线传输距离多长_网线数据传输最大距离是多少米
  2. 华为mate40计算机,原来拍摄还能这么玩?华为Mate40 Pro连接电脑+耳机,Vlog输出分分钟...
  3. 安装模块时提示Collecting package metadata (repodata.json): failed
  4. Organization Unit buffer - OOATTRCUST
  5. 【java】ASM代理方式 Byte-Buddy代理方式 Javassist代理方式
  6. .net vue漂亮登录界面_6个宝藏级Vue管理后台框架 必须收藏
  7. matlab抓取股票数据,Matlab通过sina web接口获取个数即时股票数据函数实现代码
  8. mysql 主从 锁库_mysql 5.7.21 主从集群恢复GTID方式(不锁库)
  9. C++基础——用C++实例理解UML类图
  10. C++ tbb::atomic
  11. 常用符号计算机输入法,九种常用输入法特殊符号功能揭密输入法 -电脑资料
  12. 犯贱报(一张浓缩大学生活的..)
  13. 网络投票的另一面:“刷票”与“防刷” 大PK
  14. TypeScript--适合小白吧(应该)
  15. 念念不忘,必有回响:Powered By Typecho
  16. MySQL创建S,P,J,SPJ表,以及SQL语句
  17. 无线蓝牙耳机哪种款式好用?口碑最好的蓝牙耳机推荐!
  18. const和extern用法
  19. VMware Workstation pro无法在Windows上运行,检查可在Windows上运行的此应用的更新版本(无需卸载原先版本或原先版本卸载的按钮变成灰色)
  20. 《周志明的软件架构课》学习笔记 Day6

热门文章

  1. 手机便携版_智能体验醇音随行 哈曼卡顿音乐琥珀便携版评测
  2. jquery 所有contenteditable=true的元素_JavaScript学习笔记(三十一) jQuery(上)
  3. table id=datatable - Requested unknown parameter 'tname' for row 0, column 4. 解决
  4. fullcalendar内容如何默认展示一条其他的点击展示_LinkedIn广告全指南:如何从零开始成为Linkedin广告高手?...
  5. Hive数据倾斜及处理
  6. html 图片 按钮,css按钮背景图片如何实现?(代码实例)
  7. mysql初学者_MYSQL初学者使用介绍
  8. php redis zset 延迟队列_用PHP+Redis实现延迟任务,实现自动取消订单
  9. C++ 智能指针后面 . 与 -> 运算符的一点体会
  10. 单元测试spock框架基础