二叉树的认识

news2025/1/17 22:53:14

愚昧将使你达不到任何成果,并在失望和忧郁之中自暴自弃。                   --达芬奇
目录

🍁一.二叉树的概念

🍁二.二叉树的特点,结构 

🍁三.三种特殊的二叉树

🍁1.斜树

🍁2.满二叉树 

🍁3.完全二叉树

🍁四.二叉树的性质

🍁五.二叉树的存储方式

🍁1.顺序存储

🍁2.链式存储



参考书籍:《大话数据结构》--程杰

🍁一.二叉树的概念

二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的,分别称为根结点的左子树和右子树的二叉树组成。
就像树里面用孩子兄弟表示法,表示出来的树,就是链式的二叉树。
就像下面的图,就是一颗二叉树:

🍁二.二叉树的特点,结构 

二叉树的特点:
1.
每个结点最多有两个子树,也就是一个结点的度最多为2。
2.左子树和右子树是有顺序的,次序不能颠倒。
3.某个结点只有一颗子树,也要区分它是左子树还是右子树。
就像下面这样,两个二叉树的结构是不一样的。

二叉树的五种大分类结构:
1.空二叉树
2.只有一个根节点
3.根结点只有左子树
4.根结点只有右子树
5.根结点既有左子树也有右子树

🍁三.三种特殊的二叉树

🍁1.斜树

顾名思义,斜树它一定要斜,但是不能乱斜,它还是有点讲究的。
斜树:所有的结点都只有左子树的二叉树或者所有结点都只有右子树的二叉树,两中统称为斜树。
就像下面的二叉树就是左斜树和右斜树。

这其实就很像我们之前学过的单链表,其实线性表结构就可以理解为是树的一种极其特殊的表现形式。 

🍁2.满二叉树 

满二叉树一样,顾名思义,主打突出一个满字,那要如何满的二叉树,才能称作满二叉树呢?
满二叉树:在一颗二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有的叶子都在同一层上,这样的二叉树称为满二叉树。
如下图所示:

是不是非常对称,中国一向以对称为美,这样的二叉树我们也叫完美二叉树。
满二叉树的特点: 
1.
叶子结点只能出现在最后一层。
2.非叶子结点的度一定为2。
3.同样深度的二叉树,满二叉树的结点数,叶子结点数最多。
4.假设该满二叉树的高度为k,总结点数为2^k-1(使用等比数列推出来的)。第n层结点数为2^(n-1)。

🍁3.完全二叉树

完全二叉树:完全二叉树的定义是一个深度为k的有n个节点的二叉树,对树中的节点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,那么这颗树就叫完全二叉树。
完全二叉树和满二叉树的关系:完全不一定满,但满一定完全,故而完全二叉树不一定是满二叉树,而满二叉树一定是一个完全二叉树。

完全二叉树一定是和满二叉树类似的,最后一层的结点一定是连续的,如果完全二叉树的某个结点没有右子树,那么就一定没有左子树。
就如同下面的结构:
在这里插入图片描述
二叉树的特点:
1.
叶子结点只能出现在最下面的两层。
2.最下层的叶子结点一定集中在左边。
3.倒数第二层的叶子结点一定集中在右边。
4.如果结点的度为1,那么该结点只有左孩子,而没有右孩子。

🍁四.二叉树的性质

二叉树的几个性质还是比较重要的,在做一些二叉树的选择,填空题时,可能就会用到这些性质。
性质1:
1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点。
这个比较好理解,我们就用满二叉树来举例,它每一层的结点都是上一层的二倍,每一层的结点都是成等比数列增长的。

性质2: 
2.
 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h-1,我们还是以满二叉树来举例。
第一层:有1个根结点
第二层:有2个结点
第三层:有4个结点
第四层:有8个结点
依次类推,满二叉树的每一层的结点,都是以等比数列增长的,把它们的结点相加起来,其实就是等比数列求和,得到满二叉树的结点总数为2^h-1。

性质3:
对于任何一颗二叉树,如果它的叶子结点数为m,度为2的结点数为n,则m=n+2
这个结论记住就是,推导起来有点麻烦。

性质4:
具有n个结点的完全二叉树的深度为[logn]+1,([x]表示不大于x的最大值整数)。这个同样记住就是,推导起来比较麻烦。

性质5:
对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点。
2. 若2i+1>=n否则无左孩子。
3. 若2i+2>=n否则无右孩子。
这个如何理解呢?这就要说到二叉树的存储方式:顺序存储。

🍁五.二叉树的存储方式

🍁1.顺序存储

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆马上就会讲。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

物理上就是实实在在在内存中如何存储的,而逻辑上的就是我们想象出来的。

知道了完全二叉树的顺序存储了之后,我们就可以来理解一些上面的性质5了。
性质5:
对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点。
2. 若2i+1>=n否则无左孩子。
3. 若2i+2>=n否则无右孩子。 

关于第一点:

双亲结点下标为i,左孩子为2*i+1,右孩子为2*i+2。 
关于性质5的2,3点。
2i+1>=n,左孩子的下标超过了数组下标的范围,那么肯定就没有左孩子了呀。
2i+2>=n,同样右孩子的下标超过了数组下标的范围,那么肯定也就没有右孩子了。

🍁2.链式存储

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来表示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面学到(C++来实现)高阶数据结构如红黑树等会用到三叉链。

后面的二叉树的链式结构就是二叉链,比如说二叉树的前中后序遍历等等,都会用到二叉链来实现。

代码的表示:

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
 struct BinTreeNode* left; // 指向当前节点左孩子
 struct BinTreeNode* right; // 指向当前节点右孩子
 BTDataType data; // 当前节点值域
};

// 三叉链
struct BinaryTreeNode
{
 struct BinTreeNode* parent; // 指向当前节点的双亲
 struct BinTreeNode* left; // 指向当前节点左孩子
 struct BinTreeNode* right; // 指向当前节点右孩子
 BTDataType data; // 当前节点值域
};

总结:这里我们只是简单的认识了一下二叉树,知道了二叉树一些基础知识,后续才是重头戏,像堆排序,堆排序的应用,还要二叉树的链式结构,还有很多二叉树的OJ题,够我们啃好久了。
但是世上无难事,只怕有心人,为了写堆排序和堆的应用,我自己也学习了好久,没看懂的反复反复看,手写推导公式,总算是理解透彻了。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Learning C++ No.24 【哈希/散列实战】

引言: 北京时间:2023/5/20/7:30,周六,可惜有课,而且还是早八,说明我们现在没有多少的学习时间啦!得抓紧把该博客的引言给写完,我们距离期末考越来越近啦!再过一个星期就…

客服系统搭建,这些技能你必须知道

作为客服系统领域的专家,我来为大家介绍一些客服系统搭建的技能。在本文中,你将了解到如何搭建一个高效的客服系统以及如何应对可能出现的问题。 选择合适的客服系统 在选择客服系统时,需要考虑以下几个因素: 处理的工单量用户…

《人月神话》译文修订明细(3)-读者可以对照修改

《人月神话》译文修订明细(1)-读者可以对照修改 《人月神话》译文修订明细(2)-读者可以对照修改 《人月神话》译文修订如下,读者可以对照自己手上的书修改。 相关阅读 这回真要动刀子-征集《人月神话》中译本的翻译…

java开发学习框架

Java基础 1.1. Java简介与安装 1.2. Java基本语法 1.3. 数据类型与变量 1.4. 运算符与表达式 1.5. 流程控制(分支与循环) 1.6. 数组 面向对象编程 2.1. 类与对象 2.2. 继承与多态 2.3. 接口与抽象类 2.4. 封装与访问控制 2.5. 重载与覆盖 2.6. Java内存管…

【面试题】 ES6中将非数组转换为数组的三种方法

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 我们常常想使用数组的方法,比如forEach,filter,又或者so…

ChatGPT、Java 8 文档、MySQL都说 JDBC 没必要 `Class.forName()`,结果报错了……

文章目录 回顾 Tomcat 部署 WAR 应用报错找不到数据库驱动的问题ChatGPT、Javadoc 和 MySQL 驱动都说没必要 Class.forName()实验创建一个最小复现问题的 Demo不调用 Class.forName("com.mysql.cj.jdbc.Driver")调用 Class.forName("com.mysql.cj.jdbc.Driver&q…

chatgpt赋能python:Python的输出功能及其应用

Python的输出功能及其应用 Python是一种高级编程语言,它具有动态类型的解释性能力,是一种简洁、易于学习和易于阅读的编程语言。Python拥有非常强大的输出功能,使得开发者可以以多种形式输出数据结果,这对于数据分析、数据处理和…

人工智能值不值得学习?人工智能就业方向及前景

人工智能值不值得学习? 一、人工智能值得学吗? 很多同学想要知道人工智能值得学吗?小编认为是值得的,具体原因有以下两点: 1、人工智能专业前景好,但人才紧缺 根据人工智能行业的专家预计,到2020年&am…

华为CE12808/S9700交换机istack/CSS堆叠主备倒换操作命令步骤

一、华为CE12808交换机,istack堆叠状态 1、设备型号: 交换机一: HUAWEI CE12808 交换机二: HUAWEI CE12808 2、istack堆叠主备倒换操作步骤: 2.1、设备当前配置保存并进行备份。 2.2、切换所用命令。 执行命令display…

红黑树的插入。

一,一颗红黑树满足的性质 ①每个结点或是红色,或是黑色。 ②根结点是黑色的。 ③叶结点(虚构的外部节点NULL结点)都是黑色的。 ④不存在两个相邻的红结点。 ⑤对每个结点,从该结点到任一结点的简单路径上,…

【JavaSE】Java基础语法(二十):多态

文章目录 1. 多态的概述2 .多态中的成员访问特点3. 多态的好处和弊端4. 多态中的转型5. 多态中转型存在的风险和解决方案 (应用)6. 多态的实用价值 1. 多态的概述 什么是多态 同一个对象,在不同时刻表现出来的不同形态 多态的前提 要有继承或实现关系要有方法的重写…

SQLite 数据库入门教程(GO)

文章目录 SQLite数据库入门教程一、SQLite 简介1、什么是 SQLite?2、为什么要用 SQLite? 二、SQLite 安装1、在 Windows 上安装 SQLite2、在 Linux 、Mac OS上安装 SQLite 三、SQLite 命令四、SQLite 使用1、SQLite 数据类型2、SQLite 语法3、SQLite 可视…

chatgpt赋能python:Python百分比怎么算?-从基础到逐层深入

Python百分比怎么算? - 从基础到逐层深入 Python是目前全球最流行的编程语言之一,由于其易学易用的特点,广泛地应用于数据处理、Web开发、自动化测试等不同领域。当我们需要对一些数据进行计算和分析时,经常需要对百分比进行计算…

Linux第二天

上传 scp -r 本地文件路劲 用户名目标主机地址:路径 下载:scp -r 用户名目标主机地址:路径 本地目录 ls -A /root //查看root文件下所有的隐藏文件 命令:ls 选项: -l:查看文件属性 -h:文…

【Python】继承与多态

知识目录 一、写在前面✨二、继承三、多态四、Account和FreeChecking类的实现五、总结撒花😊 一、写在前面✨ 大家好!我是初心,希望我们一路走来能坚守初心! 今天跟大家分享的文章是 Python中的继承与多态 ,希望能帮…

在windows下安装linux和kali子系统

目录 安装子系统 报错解决官方方法 步骤 1 - 启用适用于 Linux 的 Windows 子系统 步骤 2 - 检查运行 WSL 2 的要求 步骤 3 - 启用虚拟机功能 步骤 4 - 下载 Linux 内核更新包 步骤 5 - 将 WSL 2 设置为默认版本 步骤 6 - 安装所选的 Linux 分发 排查安装问题 下载发行…

【JavaSE】Java基础语法(二十一):内部类

文章目录 1. 内部类的基本使用2. 成员内部类3. 局部内部类4. 匿名内部类5. 匿名内部类在开发中的使用(应用) 1. 内部类的基本使用 内部类概念 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类 内部类定…

YOLOv8目标检测实战:Android手机部署 (视频课程)

课程链接:https://edu.csdn.net/course/detail/38595 YOLOv8 目标检测基于先前 YOLO 版本的成功,引入了新功能和改进,进一步提升了性能和灵活性。 本课程在Windows上手把手演示YOLOv8(YOLOv8n和YOLOv8s)目标检测在An…

jvm 分析调优工具-学习笔记

jvm 分析调优工具 jps命令查看java进程pid jps 列出java进程名(不完整类名) 和pid jps -l 列出java进程名(完整类名) 和pid jmap命令查看java进程占用的jvm资源情况 jmap -histo pid 查看内存情况 jmap -heap pid 查看java程序的堆占用信息 jmap -dump 导出heap快照分析文件he…

22 VueComponent 响应式处理

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 测试用例如下, 一个简单的 按钮事件的触发 问题的调试 数据…