数据结构(超详细讲解!!)第二十四节 二叉树(上)

1.定义

二叉树(Binary Tree)是另一种树型结构。    

二叉树的特点:

1)每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点);

2)二叉树的子树有左右之分,其次序不能任意颠倒。    

二叉树的递归定义  

二叉树(BinaryTree)是n(n≥0)个结点的有限集。它或者是空集(n=0),或者同时满足以下两个条件: 

(1) 有且仅有一个根结点;  

(2) 其余的结点分成两棵互不相交的左子树和右子树。

二叉树的抽象数据类型   ADT BinaryTree {  D、R、P   }

 二叉树与树有区别:树的子树没有顺序,但如果二叉树的根结点只有一棵子树,必须明确区分它是左子树还是右子树,因为两者将构成不同形态的二叉树。因此,二叉树不是树的特例。它们是两种不同的数据结构。

二叉树有5种基本形态:

2.性质

性质1:若二叉树的层次从1开始, 则在二叉树的第 i 层最多有 2i-1 个结点。(i  1)

性质2:深度为k的二叉树至多有2k-1个结点(k>0)。

性质3:对于任何一棵二叉树,若度2的结点数有n2个,叶子结点数为n0,则n0=n2+1。

特例:

1)满二叉树:深度为k且有 2k-1个结点的二叉树。

特点:每一层上的结点数都是最大结点数。满二叉树不存在度数为1的节点,且树叶都在最下一层。可以对满二叉树的结点进行连续编号。

2)完全二叉树:深度为k,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n 的结点一一对应时,称之为完全二叉树。

特点:

(1)叶子结点只可能在层次最大的两层上出现;              

(2)对任一结点,若其右分支下的子孙的最大层次为h,则其左分支下的子孙的最大层次数必为h或h+1。

对于特殊性质的二叉树,还具备以下2个性质:

性质4:具有n个结点的完全二叉树的深度必为log2n+1。

性质5:如果对一棵有n个结点的完全二叉树(其深度为log2n+1)的结点按层序编号,则对任一结点i(1≤i≤n),有:

1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲parent(i)是结点i/2 ;        

2)如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其 左孩子lchild(i)是结点2i;        

3)如果2i+1>n,则结点i无右孩子;否则其右孩子rchild(i) 是结点2i+1。

3.存储结构

1.顺序存储结构

 二叉树的顺序存储,是采用一组连续的存储单元来存放二叉树中的结点,但是,由于二叉树是非线性结构,所以结点之间的逻辑关系难以从存储的先后确定。不过,由二叉树的性质5可知,对于完全二叉树,如果按照从上(根结点)到下(叶结点)和从左到右的顺序,对二叉树中的所有结点从0到n-1编号,这样存放到一维数组中。只要通过数组元素的下标关系,就可以确定二叉树中结点之间的逻辑关系。

#define  MAXSIZE  100	
typedef  int  ElemType;	
typedef struct wqbtree
{
 	ElemType SequenBiTree[MAXSIZE];
	int n;		/*记录节点总数*/
}Fbitree;

对于一般的二叉树,如果仍采用顺序表示,首先要对它进行扩充,增加一些并不存在的空结点,使之成为一棵完全二叉树,然后再用一维数组顺序存储。

缺点:浪费存储空间。

完全二叉树用顺序存储结构,一般二叉树用链式存储结构。

2.链表存储结构

1.二叉链表

由于二叉树每个结点至多只有2个孩子,分别为左孩子和右孩子。因此可以把每个结点分成三个域:一个域存放结点本身的信息,另外两个是指针域,分别存放指向左、右孩子的指针。每个结点的结构表示为:

typedef  int  ElemType;	
typedef struct BiTreeNode
{ 	ElemType data;
	struct BiTreeNode *lchild, *rchild;
}BiTreeNode, *BiTree;

一个二叉链表由根指针root唯一确定。若二叉树为空,则root=NULL;若结点的某个孩子不存在,则相应的指针为空。 

具有n个结点的二叉链表中,共有2n个指针域。其中只有n-1个用来指示结点的左、右孩子,其余的n+1个指针域为空。

 若一个二叉树含有n个结点,则它的二叉链表中必含有2n个指针域, 其中必有n+1个空的链域。

2.三叉链表

为了便于找到结点的双亲,可以在结点结构中增加一个指向其双亲结点的指针域,此时二叉链表变为三叉链表。 三叉链表的结点结构

typedef  int  ElemType;
typedef struct ThrTreeNode{
	ElemType data;
	struct ThrTreeNode  *lchild, *rchild,*parent;
}ThrTreeNode, *ThrTree;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于数据摆渡 你关心的5个问题都在这儿!

数据摆渡,这个词语的概念源自于网络隔离和数据交换的场景和需求。不管是物理隔离、协议隔离、应用隔离还是逻辑隔离,最终目的都是为了保护内部核心数据的安全。而隔离之后,又必然会存在文件交换的需求。 传统的跨网数据摆渡方式经历了从人工U…

MacOS “xxxxx“,已损坏,无法打开,你应该将它移到废纸篓

在这里插入图片描述 解决方案 应用程序 - 实用工具中打开终端,输入命令, sudo xattr -r -d com.apple.quarantine 然后将程序拖放至命令窗口,如下图:

哈希表-set、map

当需要判断一个元素是否在集合中时,就使用哈希法 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。 哈希表中关键码就是数组的索引下标,然后通过…

iOS合并代码后解决冲突

合并主干和分支代码后有冲突,xcode无法运行,如下图:文件显示不了,项目名也显示不了 解决冲突: 1.选中左边目录栏的项目名。鼠标右键--> Show in Finder 2.选中项目文件 xxxx.xcodeproj。鼠标右键--> 显示包内容…

人工智能基础部分22-几种卷积神经网络结构的介绍,并用pytorch框架搭建模型

大家好,我是微学AI,今天给大家介绍一下人工智能基础部分22-几种卷积神经网络结构的介绍,本篇文章我将给大家详细介绍VGG16、VGG19、ResNet、SENet、MobileNet这几个卷积神经网络结构,以及pytorch搭建代码,利用通用数据…

JavaScript编程基础 – 对象

JavaScript编程基础 – 对象 JavaScript Programming Essentials – Object 本文简要介绍JavaScript面向对象编程,如何实现其中的对象以及实例演示,希望对大家学习JavaScript有所帮助。 1. 面向对象编程特点 面向对象编程(Object-Oriented Programmi…

阿里云服务器ECS产品知识及购买和使用常见问题及答案汇总

本文总结了阿里云用户在购买和使用阿里云服务器中的一些常见的问题,包括什么是云服务器ECS,特性与优势,应用场景,基本概念,使用限制等众多问题,让您全方位了解阿里云服务器,并根据自己的需求选择…

在ASP.NET Core 中使用 .NET Aspire 消息传递组件

前言 云原生应用程序通常需要可扩展的消息传递解决方案,以提供消息队列、主题和订阅等功能。.NET Aspire 组件简化了连接到各种消息传递提供程序(例如 Azure 服务总线)的过程。在本教程中,小编将为大家介绍如何创建一个 ASP.NET …

Lora学习资料汇总

目录 LoRa联盟 Semtech lora网关供应商: LoRaMAC API文档 论坛 开发板 主流技术对比分析 LoRa网络距离模拟测试方法 LoRa应用 LoRa联盟 LoRa联盟:LoRaWAN规范的制定组织 https://www.lora-alliance.org/ LoRa技术白皮书:https://www.lora-alli…

vue2指令的使用和自定义指令

前言 个人认为vue的指令,对比react来说,给开发者节省了很大的学习成本。比如在react中,你想渲染一个列表,需要用Array.map的方法return<div>,而在vue中,一个简单的v-for就解决了问题。 在学习成本和入手体验上,vue的作者确实后来者居上,能让人更快的使用vue开发。不过也…

【unity实战】如何更加规范的创建各种Rogue-Lite(肉鸽)风格的物品和BUFF效果(附项目源码)

文章目录 前言定义基类实现不同的BUFF效果一、回血BUFF1. 简单的回血效果实现2. BUFF层数控制回血量 二、攻击附带火焰伤害三、治疗领域1. 简单的治疗领域实现2. 添加技能冷却时间 通过拾取物品获取对应的BUFF参考源码完结 前言 当创建各种Rogue-Lite&#xff08;肉鸽&#xf…

接口传参数list的时候,items里面放个​​​​​​​list

item里面放个list 先定义一个 list&#xff0c;循环add加入参数

xorm源码学习

文章目录 XORM源码浅析及实践ORMORM vs. SQLXORM软件架构 ORM 引擎 Engine——DBM*core.DB Golang&#xff1a;database/sql 源码基本结构连接复用&#xff0c;提高性能。增加数据库连接池数量连接管理 database/sql主要内容&#xff1a;sql.DB创建数据库连接sql.Open()DB.conn…

状态设计模式是什么?什么是 State 状态设计模式?Python 状态设计模式示例代码

什么是 State 状态设计模式&#xff1f; 状态设计模式是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态发生改变时改变其行为&#xff0c;使其看起来好像改变了其类。状态模式主要解决的问题是&#xff1a;当一个对象的行为取决于它的状态&#xff0c;并且在运行时…

2023年亚太地区数学建模大赛

中国新能源电动汽车的发展趋势 新能源汽车是指采用先进的技术原理、新技术和新结构&#xff0c;以非常规车用燃料&#xff08;非常规车用燃料是指汽油和柴油以外的燃料&#xff09;为动力源&#xff0c;集成先进的汽车动力控制和驱动技术的汽车。新能源汽车包括四大类型&#…

人工智能带来的各方面影响

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术在各个领域中的应用越来越广泛&#xff0c;已经开始对我们的生活方式、社会和经济结构产生深远的影响。 1.人工智能家庭化。人工智能技术使我们的生活变得更加便利和智能化。在家庭日常中&#xff0c;智能家居、智能…

WPF绘图使用介绍

文章目录 WPF绘图基本用法绘制直线在XAML中绘制直线在C#代码中绘制直线使用Path绘制直线注意 矩形绘制在XAML中绘制矩形在C#代码中绘制矩形设置矩形的位置使用圆角矩形 画刷1. SolidColorBrush2. LinearGradientBrush3. RadialGradientBrush4. ImageBrush5. DrawingBrush6. Vis…

FDG6306P PowerTrench® MOSFET P沟道 特点及其应用详解

关于PowerTrench MOSFET&#xff1f; 它是一种MOS场效应晶体管&#xff0c;可以提高系统效率和功率密度。该技术采用了屏蔽栅极技术&#xff0c;可以减少开关损耗和导通损耗&#xff0c;从而提高了系统效率。此外&#xff0c;PowerTrench MOSFET还具有低导通电阻和高开关速度的…

Python---函数的应用案例(多个)涉及函数、字符串翻转修改

案例&#xff1a;使用print方法打印一条横线 下面是最原始的方法&#xff1a; print(- * 40) 案例&#xff1a;对上个案例进行升级&#xff0c;可以根据输入的num数值&#xff0c;生成指定数量的横线 相关链接Python----range方法&#xff08;函数&#xff09;-CSDN博客 Pyt…

现代计算与光学的跨界机遇——

时至今日&#xff0c;互补氧化金属半导体&#xff08;CMOS&#xff09;技术的飞速发展促进了集成电路的空前成功。 晶体管的创新与时俱进 正如戈登-E-摩尔&#xff08;Gordon E. Moors&#xff09;在1965年预测的那样&#xff0c;每隔18-24个月&#xff0c;计算芯片上的晶体管数…