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

news2024/9/25 1:17:45

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;

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

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

相关文章

关于AssetBundle禁用TypeTree之后的一些可序列化的问题

1)关于AssetBundle禁用TypeTree之后的一些可序列化的问题 2)启动Unity导入变动的资源时,Singleton ScriptableObject 加载不到 3)Xcode15构建Unity 2022.3的Xcode工程,报错没有兼容的iPhone SDK 这是第361篇UWA技术知识…

EPSon打印机更换色带

1、打印机色带拆装视频 打印机色带更换 2、色带盒四周有多个卡扣,需从右到左依次轻微用力掰开,使盖板与盒体脱离,注意不要掰断卡扣。 3、如何将色带放入打印机色带盒? A、色带放入盒体时不可打乱打结,以免卡带&#x…

图解Spark Graphx基于connectedComponents函数实现连通图底层原理

原创/朱季谦 第一次写这么长的graphx源码解读,还是比较晦涩,有较多不足之处,争取改进。 一、连通图说明 连通图是指图中的任意两个顶点之间都存在路径相连而组成的一个子图。 用一个图来说明,例如,下面这个叫graph…

合理运用ChatGPT使用Python编写一个桌面便签应用

ChatGPT的编程能力也不差,本次我就一步一步提要求,让ChatGPT根据我的要求,编写出一个可用的,可打包运行的桌面便签。 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QAction, QSystemTrayIco…

通信原理板块——时分复用

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、基本概念 复用的目的是为了扩大…

宏集新闻 | 虹科传感器事业部正式更名为宏集科技

致一直支持“虹科传感器”的朋友们: 为进一步整合资源,给您带来更全面、更优质的服务,我们非常荣幸地宣布,虹科传感器事业部已正式更名为宏集科技。这一重要的改变代表了虹科持续发展进程中的新里程碑,也体现了我们在传…

GitHub 报告发布:TypeScript 取代 Java 成为第三受欢迎语言

GitHub发布的2023年度Octoverse开源状态报告发布,研究围绕AI、云和Git的开源活动如何改变开发人员体验,以及在开发者和企业中产生的影响。报告发现了三大趋势: 1、生成式AI的广泛应用: 开发人员大量使用生成式AI进行构建。越来越…

智能座舱架构与芯片- (14) 测试篇 上

一、 验证平台概要 1.1 测试软件方法论 “软件定义汽车” 的时代,软件在整车制造中的重要性日渐凸显。但不同于其他行业的软件开发,汽车行业有自己独特的软件开发要求。首先是需求严谨、需求层次复杂、需要通过专业的工具进行管理;其次开发…

张弛声音变现,如此配音是一场史诗

在给战争剧进行配音的过程中,配音艺术家须突出剧中的紧迫气氛、战斗场面的惊心动魄以及人物的英雄气概。战争剧经常涉及密集的战斗描写、复杂的策略以及角色间深刻的情感纠葛。以下是为战争剧配音时的几点指导思路: 强烈且充满张力的语气 在配音时使用充…

【C++】string类的介绍与使用

🧑‍🎓个人主页:简 料 🏆所属专栏:C 🏆个人社区:越努力越幸运社区 🏆简 介:简料简料,简单有料~在校大学生一枚,专注C/C/GO的干货分…

已完结7个,再启动1个新项目,嘎嘎强!

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 大家好,我是技术UP主小傅哥。 💐又到了启动新项目的时候,死鬼开心嘛。小傅哥的星球&#xf…

六大排序详讲(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序)

文章目录 排序一、 排序的概念1.排序:2.稳定性:3.内部排序:4.外部排序: 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四、交换排序1.冒泡排序2.快速排序…

C# Onnx 百度PaddleSeg发布的实时人像抠图PP-MattingV2

目录 效果 模型信息 项目 代码 下载 效果 图片源自网络侵删 模型信息 Inputs ------------------------- name:img tensor:Float[1, 3, 480, 640] --------------------------------------------------------------- Outputs -----------------…

梳理一名Go后端程序员日常用的软件~

大家好,我是豆小匠。 这期分享下我日常工作用到的软件和工具! 省流版图片↓↓↓ 工具分为四类:编码软件、笔记/文档软件、开发工具和日常软件等。 1. 编码软件 1.1. Goland 出自JetBrain家族,IDE的王者,作为我的…

基于Towers of Binary Fields的succinct arguments

1. 引言 Ulvetanna团队Benjamin E. Diamond和Jim Posen 2023年论文《Succinct Arguments over Towers of Binary Fields》,开源代码见: https://github.com/recmo/binius(Rust Sage)【基于plonky3等库】 在该论文中&#xff1…

Unity中Shader反射环境

文章目录 前言一、制作反射环境的两种办法法1:属性面板接收一个 Cubemap 作为反射环境法2:把环境烘焙成一张Cubemap 二、在Unity中实现把环境烘焙成一张Cubemap1、先创建一个反射探针(可以直接创建,也可以空物体增加组件&#xff…

【giszz笔记】产品设计标准流程【7】

(续上回) 今天来讨论下产品设计标准流程中,交互设计和视觉设计的内容。 想参考之前文章的,我把链接给到这里。 【giszz笔记】产品设计标准流程【6】-CSDN博客 【giszz笔记】产品设计标准流程【5】-CSDN博客 【giszz笔记】产品…

搭个网页应用,让ChatGPT帮我写SQL

大家好,我是凌览。 开门见山,我搭了一个网页应用名字叫sql-translate。访问链接挂在我的个人博客(https://linglan01.cn/about)导航栏,也可以访问https://www.linglan01.cn/c/sql-translate/直达sql-translate。 它的主要功能有:…

将kali系统放在U盘中插入电脑直接进入kali系统

首先准备一个空白的 U 盘。 Kali Linux | Penetration Testing and Ethical Hacking Linux Distribution 在 Windows 上制作 Kali 可启动 USB 驱动器 Making a Kali Bootable USB Drive on Windows | Kali Linux Documentation 1. 首先下载 .iso 镜像 Index of /kali-images…

释放C盘空间:WinSXS文件夹真实性大小判断及释放占用空间

文章目录 WinSxS文件分析判断WinSxS文件真实大小清理WinSxS文件夹推荐阅读 WinSxS文件分析 组件存储(WinSxS 文件夹)包含组成 Windows 并允许你操作系统的组件。 这些组件保存在此文件夹中,以防需要回滚更改或修复损坏的文件。 此文件夹中的…