热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

树转化为二叉树_深入理解二叉树的特点

前言在计算机科学中,二叉树(Binarytree)是一个连通的无环图,每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左

前言

bea613d039dcbea925705a11edf31198.png

在计算机科学中,二叉树(Binary tree)是一个连通的无环图,每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。最顶层的节点称为root节点,也就是根节点。每个具有1个或者2个的子节点的节点称为父节点,没有子节点的节点称为叶子节点。拥有同一个父节点的节点称为兄弟节点。

一些术语

深度: 从根节点到指定节点的边的个数

高度: 从指定节点到叶子节点的边的个数

树的高度: 指的是根节点的高度,也即根节点到最深叶子节点的边的个数。

满二叉树: 指的是树中每个节点有必须有0个或者2个子节点的二叉树。如下:

252cfe1c580909a763701f579865bf14.png

完全二叉树:是指在二叉树里面除了最下面的2层节点之外,之上的节点都必须有2个孩子节点,最底层的叶子节点没有孩子,在倒数第二层的节点可以拥有0,1,2个孩子节点,此外,最底层级别的节点添加必须从左到右,不能跳跃。如下:

a6177b992eca712ebab904c56c1fa324.png

完全二叉树是非常特别的树,它尽可能的保证了均衡性,拥有N个节点的完全二叉树的的高度最大是O(log N),这里可以很容易观察到规律,如:N= 1 + 2 + 4 + 8 + 2的h次方 ,求高度h=2(h+1)次方-1求对数=O(log n)。

注:时间复杂度O里面,通常忽略掉常数项。

树结构的优点

主要优点如下:

(1)树结构可以反映数据里面的结构化关系。

(2)树结构常常用来代表层级和等级

(3)树结构提供了高效的插入和搜索。(与HashMap的区别在于Tree结构可以提供范围检索,排序等额外优点)

(4)树结构是非常灵活的,可以付出很小的代价移动一颗子树。

满二叉树 VS 完全二叉树

(一) 不是每一个满二叉树都是完全二叉树

(1) 满二叉树的叶子节点可以出现在任何级别,完全二叉树只能出现最底层的两个级别。

(2) 满二叉树最底层的级别的添加,不需要从左到右

(二)不是每一个完全二叉树都是一个满二叉树

(1)完全二叉树的节点可以拥有0,1,2 个孩子节点,而满二叉树只能是0或者2个。

(三)用来做二叉搜索树

当使用满二叉树或者完全二叉树来做二叉搜索树的时候,树的均衡性至关重要,节点的深度决定了找到一个具体的节点,需要经过几次查询,从这一点看完全二叉树是更适合的,因为它更加均衡,但其缺点是在删除或者添加节点时,需要重新调整结构,这样就有可能导致一大批节点移动,这是它的不足之处。因此出现了一些改进的拥有不错平衡能力的树结构,如红黑树和AVL树,实际上它们是在满二叉树基础上并加入了额外的约束来保证平衡性。比如在红黑树里面,为了保证满足满二叉树的特点,其所有节点都有两个子节点,尽管其中的一个或两个可能是空叶子(用null表示),这个后续在细说。

树的遍历

遍历指的是访问整颗树的所有节点,由于树是一个非线性的数据结构,所以这儿没有唯一的遍历方式,大体上可分为两种遍历类型: (一) 深度优先遍历

深度优先遍历又分为三种策略:

(1)前序遍历 (先根节点,然后左孩子和右孩子)

(2)中序遍历 (先左孩子,然后父节点和右孩子)

(3)后序遍历 (先左孩子,然后右孩子和父节点)

(二) 广度优先遍历

广度优先遍历仅仅只有一种策略按层级顺序遍历,遍历的顺序是从顶到底,从左到右。

如下图使用不同的遍历输出:

c48cf63beb749fe64abae4dfeb3e8dc5.png

前序: 8, 5, 9, 7, 1, 12, 2, 4, 11, 3

中序: 9, 5, 1, 7, 2, 12, 8, 4, 3, 11

后序: 9, 1, 2, 12, 7, 5, 3, 11, 4, 8

层级顺序:8, 5, 4, 9, 7, 11, 1, 12, 3, 2

我相信除了层级遍历比较好理解外,深度遍历的三种方式都不太好理解,尽管我们在实现的时候使用递归方式,可以写出来非常简洁的代码,但是如果不理解原理,还是非常抽象,其实树的遍历,是图论里面一种遍历形式。这里面有一个著名的问题叫一笔画问题(也称欧拉回路),一笔画问题起源于柯尼斯堡七桥问题。数学家欧拉在他1736年发表的论文《柯尼斯堡的七桥》中不仅解决了七桥问题,也提出了一笔画定理,顺带解决了一笔画问题[1]。一般认为,欧拉的研究是图论的开端。

对于有向图来说,一笔画不仅指遍历所有边,而且要遵循正确的方向。严谨地说,一个连通有向图 G有欧拉路径,指存在一个顶点,从它出发,沿着有向边的方向,可以不重复地遍历图中所有的边。有向图的欧拉回路则是指可以从某一顶点开始,沿有向边的方向不重复地遍历所有边,然后回到原来出发的顶点。定理不理解无所谓,我们看看如何将书遍历问题转化成了图遍历问题,从而可以快速写出上面的三种深度遍历的结果。

我们将上面的树遍历,转化为使用欧拉回路进行对二叉树的散步,其中每条边都是一道墙,你不能横穿。在此步骤中,先后从左侧,底部,右侧开始散步,分别可得到前序遍历,中序遍历,后序遍历的结果。图示如下:

前序遍历:

2f38ecde06840e98d3b878afdbea023f.png

中序遍历:

bef4ee88ffb9bcbcdea39b46a7b07365.png

后序遍历:

9395cbc194523a53dd928c9ea8c9fe15.png

注意上面的图里面,大黑圆点的地方是遍历开始的地方,一定要把树的每一条边当成是实体墙,是不能横穿的,然后从起点开始,沿着指定有序的路线散步,走一圈之后再返回到起点的时候,就遍历完成。注意某一节点可以经过两次遍历,因为是在墙的两侧散步。 通过转化成空间的方式来理解树 的遍历,其实是非常直观的。如果掌握了这种方式,就可以很快给一个二叉树画出各种遍历的结果。

最后在广度优先的层级遍历中,这个其实最容易理解,就是沿着从上到下,从左到右的顺序连线即可。

总结

本文主要了讲解了关于二叉树的基本理论知识,这些基础知识是我们后续研究更高级的树结构的基石,如二叉搜索树,红黑树,跳跃表等。这些高级的数据结构在很多编程语言的底层库里面都有对应的实现,掌握了这些结构的原理,将更有助于我们开发,调优,排错。

参考链接:

https://www.cs.cmu.edu/~adamchik/15-121/lectures/Trees/trees.html

https://www.quora.com/What-is-the-difference-between-complete-and-full-binary-trees




推荐阅读
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 题目 E. DeadLee:思维导图与拓扑结构的深度解析问题描述:给定 n 种食物,每种食物的数量由 wi 表示。同时,有 m 位朋友,每位朋友喜欢两种特定的食物 x 和 y。目标是通过合理分配食物,使尽可能多的朋友感到满意。本文将通过思维导图和拓扑排序的方法,对这一问题进行深入分析和求解。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • a16z深入解析:代币设计的常见误区、优化策略及未来趋势分析
    a16z深入解析:代币设计的常见误区、优化策略及未来趋势分析 ... [详细]
  • 深入对话上海视九叶文鑫:HTML5技术引领智能电视新趋势
    深入对话上海视九叶文鑫:HTML5技术引领智能电视新趋势 ... [详细]
  • Webdriver中元素定位的多种技术与策略
    在Webdriver中,元素定位是自动化测试的关键环节。本文详细介绍了8种常用的元素定位技术与策略,包括ID、名称、标签名、类名、链接文本、部分链接文本、XPath和CSS选择器。每种方法都有其独特的优势和适用场景,通过合理选择和组合使用,可以显著提高测试脚本的稳定性和效率。此外,文章还探讨了在复杂页面结构中如何灵活运用这些定位技术,以应对各种挑战。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 通过使用七牛云存储服务,本文详细介绍了如何将本地图片高效上传至云端,并实现了内容的便捷管理。借助七牛云的 Python SDK,文章提供了从认证到文件上传的具体代码示例,包括导入必要的库、生成上传凭证以及处理文件路径等关键步骤。此外,还探讨了如何利用七牛云的 URL 安全编码功能,确保数据传输的安全性和可靠性。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
author-avatar
Evilchrist
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有