热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

数据结构笔记——二叉树的定义和性质

获取更多精彩内容,您还可以关注我的微信公众号——Android机动车。在一些电视节目中,会猜测商品价格,有的人是一点一点的数字累加

获取更多精彩内容,您还可以关注我的微信公众号——Android机动车

在一些电视节目中,会猜测商品价格,有的人是一点一点的数字累加,这样的策略效率太低了。其实有一种经典的折半查找算法,就类似于我们今天要说的二叉树。

二叉树定义

二叉树:是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

如下图就是一个二叉树:

二叉树特点

二叉树的特点有:

  • 每个结点最多两个子树,所以二叉树中不存在度大于2的结点。注意不是只有两棵子树,而是最多有。没有子树或者有一棵子树都是可以的。
  • 左子树和右子树是有顺序的,次序布恩那个任意颠倒。
  • 即使树中的某结点只有一棵子树,也要区分它是左子树还是右子树。如图:树1和树2是同一棵树,但却是不同的二叉树。

二叉树具有五种基本形态:

  1. 空二叉树;
  2. 只有一个根结点;
  3. 根结点只有左子树;
  4. 根结点只有右子树;
  5. 根结点既有左子树又有右子树。

特殊二叉树

再来介绍一些特殊的二叉树。

1、斜树

顾名思义,斜树一定是斜的,但是往那边斜还是有讲究的。

所有的结点都只有左子树的二叉树叫左斜树,所有结点都是只有右子树的二叉树叫右斜树。两种统称为斜树。

下面两个图分别就是左斜树和右斜树:

2、满二叉树

苏东坡有诗云:人有悲欢离合,月有阴晴圆缺,此事古难全。意思就是完美是理想,不完美才是人生。

我们通常看到的例子全是左高右低、参差不齐的二叉树,是否有完美的二叉树呢。

在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样的二叉树叫做满二叉树。如图

单单是每个结点都有左右子树,不能算是满二叉树,还必须要所有的叶子结点都处在同一层,这样就做到了二叉树的平衡。因此满二叉树的特点有:

  1. 叶子只能出现在最下面一层,出现在其他层就不能达到平衡;
  2. 非叶子结点的度一定是2;
  3. 同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。

3、完全二叉树

**对一棵具有n个结点的二叉树按层序编号&#xff0c;如果编号为i&#xff08;1<&#61;i<&#61;n&#xff09;的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同&#xff0c;则这棵二叉树称为完全二叉树。**如图&#xff1a;

首先要从字面上区分&#xff0c;“完全”和“满”的差异&#xff0c;满二叉树一定是完全二叉树&#xff0c;完全二叉树不一定是满的。

注意完全二叉树中的编号与满二叉树中的相同&#xff0c;而且编号全部连续&#xff0c;有断开的就不是完全二叉树&#xff0c;如下图中的三棵树都不是完全二叉树。

完全二叉树的特点&#xff1a;

  1. 叶子结点只能出现在最下面两层&#xff1b;
  2. 最下层的叶子一定集中在左部连续位置&#xff1b;
  3. 倒数二层&#xff0c;若有叶子结点&#xff0c;一定都在右部连续位置&#xff1b;
  4. 如果结点的度为1&#xff0c;则该结点只有左孩子&#xff0c;即不存在只有右子树的情况&#xff1b;
  5. 同样结点数的二叉树&#xff0c;完全二叉树深度最小。

我们也得出一个判断某二叉树是否是完全二叉树的方法&#xff0c;那就是看着树的示意图&#xff0c;心中默默给每个结点按照满二叉树的结构逐层顺序编号&#xff0c;如果编号出现空挡&#xff0c;就说明不是完全二叉树&#xff0c;否则就是。

二叉树的性质

二叉树有一些需要理解并记住的特性&#xff0c;便于更好地使用它。

二叉树性质1

在二叉树的第i层上至多有2i-1个结点&#xff08;i>&#61;1&#xff09;。

上图中&#xff1a; 第1层&#xff1a; 1个&#xff1a; 21-1&#61;20&#61;1 第2层&#xff1a; 1个&#xff1a; 22-1&#61;21&#61;2 第3层&#xff1a; 1个&#xff1a; 23-1&#61;22&#61;4 第4层&#xff1a; 8个&#xff1a; 24-1&#61;23&#61;8

通过数据归纳法&#xff0c;很容易得出在二叉树的第i层上最多有 2i-1个结点。

二叉树性质2

深度为k的二叉树最多有2k-1个结点&#xff08;k>&#61;1&#xff09;。

这里注意是2的k次幂再减1。

如果有一层&#xff0c;最多1&#61;21-1个结点 如果有两层&#xff0c;最多1&#43;2&#61;22-1个结点 如果有三层&#xff0c;最多1&#43;2&#43;4&#61;23-1个结点 如果有四层&#xff0c;最多1&#43;2&#43;4&#43;8&#61;24-1个结点

通过数据归纳法的论证&#xff0c;可以得出如果有k层&#xff0c;结点数最多为2k-1。

二叉树性质3

对任何一棵二叉树T&#xff0c;如果其终端结点数为n0&#xff0c;度为2的结点数为n2&#xff0c;则n0&#61;n2&#43;1

终端结点就是叶子结点&#xff0c;而一棵二叉树&#xff0c;除了叶子结点外&#xff0c;剩下的就是度为1和2的结点了&#xff0c;设n1是度为1的结点数。则树T的结点总数就是n&#61;n0&#43;n1&#43;n2

我们换个角度&#xff0c;再数一数连接线&#xff0c;由于根结点只有分支出去&#xff0c;没有分支进入&#xff0c;所以分支线总数为结点总数减去1&#xff0c;n-1&#61;n1&#43;2n2&#xff0c;又因为n&#61;n0&#43;n1&#43;n2&#xff0c;得出n0&#61;n2&#43;1 。

二叉树性质4

具有n个结点的完全二叉树的深度为不大于log2n的最大整数&#43;1 。

这里不再详细推导。

二叉树性质5

如果对一棵有n个结点的完全二叉树的结点按层序编号&#xff08;从第一层到最后一层&#xff0c;每层从左到右&#xff09;&#xff0c;对任一结点i&#xff08;1<&#61;i<&#61;n&#xff09;有&#xff1a;

  1. 如果i&#61;1&#xff0c;则结点i是二叉树的根&#xff0c;无双亲&#xff1b;如果i>1&#xff0c;则其双亲是结点 ⌊ i/2 ⌋ 。
  2. 如果2i>n&#xff0c;则结点i无左孩子&#xff08;结点i为叶子结点&#xff09;&#xff1b;否则其左孩子是结点2i 。
  3. 如果2i&#43;1>n&#xff0c;则结点i无右孩子&#xff1b;否则其右孩子是结点2i&#43;1 。

下篇文章会讲到二叉树的存储结构和遍历二叉树&#xff0c;希望大家持续关注。

更多精彩内容&#xff0c;欢迎关注我的微信公众号——Android机动车。




推荐阅读
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 堆是一种常见的数据结构,广泛应用于计算机科学领域。它通常表示为一棵完全二叉树,并可通过数组实现。堆的主要特性是每个节点的值与其父节点的值之间存在特定的关系,这使得堆在优先队列和排序算法中非常有用。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
author-avatar
手机用户2502858457
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有