【数据结构之树和二叉树】

数据结构学习笔记---007

  • 数据结构之树和二叉树概念篇
    • 1、树的概念和结构
      • 1.1、树的相关概念
      • 1.2、树的存储结构
    • 2、二叉树概念及结构
      • 2.1、二叉树概念
      • 2.2、满二叉树
      • 2.3、完全二叉树
      • 2.4、满二叉树或完全二叉树的存储形式
    • 3、堆的概念及结构
      • 3.1、堆的性质
      • 3.2、堆的意义
    • 4、二叉树的存储形式
      • 4.1、二叉树的数组存储形式
      • 4.2、二叉树的链式存储结构
      • 4.3、树、森林与二叉树之间的相互转换
        • 4.3.1、树转换为二叉树
        • 4.3.2、森林转换为二叉树
        • 4.3.3、二叉树转换为树或森林
    • 5、二叉树的基本性质
      • 5.1、二叉树性质练习题

数据结构之树和二叉树概念篇

前言:
前篇学习了 数据结构的栈和队列,那么这篇继续学习树及其相关内容基础内容。

/知识点汇总/

1、树的概念和结构

概念:树是一种非线性结构,是由有限个节点组成的具有层次关系的集合。倒立的树模样。
有一个特殊的结点,称为根节点,根节点没有前驱。
另外的子树有且只有一个前驱,可以有0个或多个后继。
因此树是递归定义的。根在上,叶在下。

1.1、树的相关概念

结点的度:一个结点的度就是结点含有的子树个数,称为该结点的度。
叶子节点或称为终端结点:度为0的结点就是叶子节点,也就是没有孩子的结点。
非终端结点或称为分支结点:度不为0的结点。
双亲结点或父节点:若一个结点含有子节点,则该节点称为其子节点的父节点。
孩子节点或子节点:一个结点含有的子树的根结点称为该结点的子节点。
兄弟结点:具有相同父节点的结点互称为兄弟结点。
树的度:一棵树中,最大的结点的度称为树的度。
结点的层次:从根结点开始定义:根一般为第一层,根的子结点为第二层,依次类推
树的高度或深度:树中各结点的最大层次,为该结点的深度。
堂兄弟结点:双亲位于同一层的结点为堂兄弟结点。
结点的祖先:从根结点到该结点所经分支上的所有结点都是该结点的祖先
子孙:以某结点为根的子树中任一结点都称为该结点的子孙。
森林:由若干棵互不相交的树的集合称为森林。可有树去掉根结点转化。

那么树的实现,该如何表示呢?用数组?用链表?

1.2、树的存储结构

三种方法,假设树的度为6
方法一:

#define N 6
struct TreeNode
{
	int val;
	struct TreeNode* childArr[N];//指针数组
};

方法二:

struct TreeNode
{
	int val;
	SeqList childSL;//顺序表
	//SeqList,C++的库可调用
};

方法三,最优方法:左孩子右兄弟表示法

struct TreeNode
{
	int val;
	struct TreeNode* leftChild;
	struct TreeNode* rightBother;
};

2、二叉树概念及结构

2.1、二叉树概念

一颗二叉树是结点的一个有限集合,该集合

1.或者为空
2.或由一个根结点加上两棵,别称为,左子树和右子树的二叉树组成。
3.二叉树不存在度大于2的结点
4.二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。

注意:对于任意的二叉树都是由一下几种情况复合而成的。

1.空树
2.只有根节点
3.只有左子树
4.只有右子树
5.左右子树均存在
二叉树的度不一定为2,但度为2一定是二叉树。
因为二叉树的度最大为2,即0~2

2.2、满二叉树

一颗二叉树,如果每一层的结点树达到最大值,那么这个二叉树就是满二叉树。
层数为:k,那么结点总数就是:2^k-1个结点
每一层都是满的,即除了叶子结点,其余所有结点的度都是2,因为只有度为0或度为2的结点。

2.3、完全二叉树

完全二叉树是效率很高的数据结构,对于深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,被称为完全二叉树,满二叉树是一种特殊的完全二叉树。

完全二叉树叶子节点只可能出现在最下层或次下层,并且最下层的叶子节点都位于左孩子(因为要保持连续性,不能颠倒)。
前n-1层是满的,最后一层不一定满(因为满二叉树是完全二叉树的特殊情况),但是从左到右必须是连续的。

高度为h的完全二叉树第h层的结点数:
最多就是:2^h - 1
最少为:2^(h-1)-1+1
即:[2^(h-1), 2^h-1]

2.4、满二叉树或完全二叉树的存储形式

1.数组 — 一层一层的存储
父子结点的关系

左孩子 = 父结点2 +1 //奇数
右孩子 = 父结点
2+2 //偶数

或者由孩子结点推父结点

父结点 = (孩子结点-1)/2

所以非完全二叉树不适合数组结构的存储,知识和链式结构存储

3、堆的概念及结构

一般是把数组数据看作一颗完全二叉树,并有以下要求

小堆:任意一个父亲 <= 孩子
大堆:任意一个父亲 >= 孩子

3.1、堆的性质

1.堆中某个结点的值总是不大于或不小于其父结点的值
2.堆总是一颗完全二叉树

练习题1:

下列关键字序列为堆的是:
A 100 60 70 50 32 65
B 60 70 65 50 32 100
C 65 100 70 32 50 60
D 70 65 100 32 50 60

举例:
A满足:
      100
  60      70
50  32   65

小结:
所以有序数组是堆,但堆不一定有序;并且这里的堆和内存空间的堆不是同一个意义。

3.2、堆的意义

  1. 堆的排序 O(N*log^N) – 根结点是该数的最大值
  2. top k问题 – 便于求顶点问题的解决
  3. 搜索

4、二叉树的存储形式

4.1、二叉树的数组存储形式

一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费等问题。
并且实际应用中,也只有堆会用数组的形式存储
即二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

4.2、二叉树的链式存储结构

用链表来指示元素的逻辑关系
通常,以链表中的每一个结点,三个域组成,分别是数据域、左指针域和右指针域,左指针指向左孩子,右指针指向右孩子。
链式结构也分为二叉链和三叉链,一般是二叉链。高阶数据结构涉及三叉链。

补充知识点(备注:后面抽空单独写篇学习该部分知识点)

1.搜素二叉树:对于根节点来说,根节点的左子树都小于根结点,根节点的右子树都大于根节点。 最多查找高度次。
2.森林:是m(m≥0)棵互不相交的树的集合,其次森林是由树构成的。
3.最优二叉树(哈夫曼树):带权路径最小的二叉树称为最优二叉树,也称为哈夫曼树。
3.1.带权路径长度:设二叉树具有n个带权值的叶子结点,从根结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和,称为带权路径长度。
3.2.哈夫曼树的定义:一棵二叉树要使其带权路径长度最小,必须使权值越大的叶子节点越靠近根节点,权值越小的叶子节点越远离根节点,并且不存在度为1的结点。
4.线索二叉树:加上线索的二叉树称为线索链表,也称为线索二叉树。
4.1.线索:考虑到具有n个结点的二叉链表,在2n个指针域中只有n-1个指针域用来存储孩子节点的地址,存在n+1个空指针域,可以利用这些空指针指向该节点在某种遍历序列中的前驱或后继结点,这些指向前驱和后继结点的指针称为线索,加上线索的二叉链表就是线索链表或线索二叉树。

4.3、树、森林与二叉树之间的相互转换

4.3.1、树转换为二叉树

一般步骤
1.加线:树中所有相邻兄弟结点之间加一条线;
2.去线:对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其它孩子结点之间的连线;
3.层次调整:按照二叉树结点之间的关系进行层次调整。
样例流程图,如下所示
在这里插入图片描述

4.3.2、森林转换为二叉树

一般步骤
1.将森林中的每根树转换为二叉树;
2.将每棵树的根结点视为兄弟,在所有根节点之间加上连线;
3.按照二叉树结点之间的关系进行层次调整。
样例流程图,如下所示
在这里插入图片描述

4.3.3、二叉树转换为树或森林

一般步骤
1.加线:若某结点x是其双亲y的左孩子,则把结点x的右孩子、右孩子的右孩子…都与结点y用线连接;
2.去线:删去原来二叉树中所有的双亲结点与右孩子结点的连线;
3.层次调整:整理1和2步骤,使之层次分明,得到树或森林。
样例流程图,如下所示
在这里插入图片描述

5、二叉树的基本性质

二叉树的5个基本性质:

1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点。
2.若规定根节点的层数为1,则深度为h的二叉树的最大节点数为2^h - 1个(等比数列推导)
3.对任何一棵二叉树,如果度为0其叶子节点个数为n0,度为2的分支节点个数为n2,则有n0 = n2 + 1;
4.若规定根节点的层数为1,具有n个结点的满二叉树的深度,h = log2^n+1。
5.对于具有n个结点的完全二叉树,如果按照从上至下,从左至右的数组顺序对所有结点从0开始编导,则对于序号为i的节点有:
1)若i>0,i位置节点的双亲序号为:(i-1)/2 , i = 0时i为根节点编号,无双亲节点;
2)若2i+1<n,左孩子序号为:2i+1,2i+1>=n,否则无左孩子;
3)若2i+2<n,右孩子序号为:2i+2,2i+2>=n,否则为右孩子。

补充
增加一个度为2的结点,一定增加一个度为0的结点。
增加一个度为1的结点,一定减少一个度为0的结点,增加一个度为0的结点.

5.1、二叉树性质练习题

第一题:
某二叉树共有399个节点,其中有199个度为2的节点,则该二叉树中的叶子节点数为()
A.不存在这样的二叉树 B.200 C.198 D.199

第二题:
下列数据结构中,不适合采用顺序存储结构的是()
A.非完全二叉树 B.堆 C.队列 D.栈

第三题:
在具有2n个节点的完全二叉树中,叶子节点个数为()
A.n B.n+1 C.n-1 D.n/2

第四题:
一颗完全二叉树的节点数为531个,那么这颗数的高度为()
A.11 B.10 C. 8 D.12

第五题:
一个具有767个节点的完全二叉树,其中叶子节点个数为()
A.383 B.384 C.385 D.386
参考答案:1.B 2.A 3.B 4.B 5.B

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

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

相关文章

R语言【paleobioDB】——pbdb_map():根据化石记录绘制地图

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_map (data, col.int"white" ,p…

宝塔面板安装MySQL8数据库

第一步&#xff1a;搜索mysql 第二步: 点击安装 我这里选择安装8版本 第三步&#xff1a;给宝塔配置mysql防火墙 第四步&#xff1a;修改数据库密码 第五步&#xff1a;想要使用navicat连接 需要修改root的权限 &#xff08;1&#xff09;使用secureCRT先登录mysql (2) 输入u…

最最常用的MySQL Shell运维脚本,赶紧收藏吧!

作为运维人员或者开发人员&#xff0c;日常的mysql运维工作我们是一定要会的&#xff0c;我收集了一些常用shell脚本&#xff0c;仅供参考&#xff01; 1、备份数据库&#xff1a; #!/bin/bashBACKUP_DIR"backup_dir" MYSQL_USER"mysql_user" MYSQL_PASS…

【DDR】基于Verilog的DDR控制器的简单实现(一)——初始化

在FPGA中&#xff0c;大规模数据的存储常常会用到DDR。为了方便用户使用&#xff0c;Xilinx提供了DDR MIG IP核&#xff0c;用户能够通过AXI接口进行DDR的读写访问&#xff0c;然而MIG内部自动实现了许多环节&#xff0c;不利于用户深入理解DDR的底层逻辑。 本文以美光(Micro…

解惑:测试圈网红工具 Jmeter 到底难在哪里

作为一名测试人员&#xff0c;你是否也曾经遇到过这些问题&#xff1a; 同样的起点&#xff0c;同样的工作时间&#xff0c;为什么别人接那么多项目&#xff0c;你还是在点点点&#xff1b;为什么别人升职了&#xff0c;而你还在原地踏步&#xff1f; 同样的工作内容&#xf…

C++力扣题目404--左叶子之和

给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 思路 首先要注意是判断左叶子&#xff0…

Java锁的分类

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

【MIT 6.S081】2020, 实验记录(3),Lab: page tables

目录 TaskTask 1: Print a page table Task Task 1: Print a page table 该实验需要增加一个 vmprint 函数&#xff0c;用于打印一个 page table&#xff0c;实现过程可以参考 vm.c 文件中的 freewalk() 函数。 在 defs.h 中增加 vmprint 的定义&#xff1a; void …

BikeDNA(七)外在分析:OSM 与参考数据的比较1

BikeDNA&#xff08;七&#xff09;外在分析&#xff1a;OSM 与参考数据的比较1 该笔记本将提供的参考自行车基础设施数据集与同一区域的 OSM 数据进行所谓的外部质量评估进行比较。 为了运行这部分分析&#xff0c;必须有一个参考数据集可用于比较。 该分析基于将参考数据集…

恭喜:ChatGPT之父与相恋多年的男友结婚,并希望早日生娃。。。

OpenAI CEO Sam Altman与伴侣Oliver Mulherin海边私密婚礼&#xff1a;爱情、事业与人工智能领域的交织 婚礼主持人是奥特曼的兄弟杰克奥尔特曼 壹.媒体流传 在科技界掀起波澜的OpenAI首席执行官萨姆奥尔特曼&#xff08;Sam Altman&#xff09;&#xff0c;近期与他长久以来的…

[Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明

类创建&#xff1a;abstract&#xff08;抽象类&#xff09;、extension&#xff08;扩展&#xff09; 1.abstract&#xff08;抽象类&#xff09; dart 抽象类主要用于定义标准&#xff0c;子类可以继承抽象类&#xff0c;也可以实现抽象类接口。抽象类通过abstract 关键字来…

activiti流程图+动态表单

使用技术 jeecg-bootactivitivue3form-create 简单效果展示 流程图绘制 审批人配置 动态表单配置 流程审批 流程审批记录 填写表单信息 源码地址 后台&#xff1a;https://gitee.com/houshixin/jmg-boot前端&#xff1a;https://gitee.com/houshixin/jmg-ui

在Linux下配置Apache HTTP服务器

在Linux的世界里&#xff0c;如果说有什么比解决各种“神秘”的故障更让人头疼&#xff0c;那一定就是配置Apache HTTP服务器了。这不是因为Apache有什么问题&#xff0c;而是因为配置它简直就像解谜游戏&#xff0c;一不留神就会让你陷入无尽的纠结。 首先&#xff0c;你需要…

数据库的数据类型

文章目录 前言一、数据类型数据类型分类数值类型bit类型小数类型floatdecimal 字符串类型charvarcharchar和varchar比较 日期和时间类型enum和set 前言 一、数据类型 数据类型分类 数值类型 下面我们来创建一个表&#xff0c;表中创建一个tinyint类型的数据。当我们不指定tiny…

记录汇川:H5U与Factory IO测试12

主程序&#xff1a; 子程序&#xff1a; IO映射 子程序&#xff1a; 辅助出料 子程序&#xff1a; 自动程序 Factory IO配置&#xff1a; 实际动作如下&#xff1a; Factory IO测试12

2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷②

2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段&#xff1a;职业素养与理论技能项目1. 职业素养项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段&#xff1a;安全运营项目1. 操作系统安全配置与加…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式培训笔记,嵌入式硬件,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机领域.https://blog.csdn.net/weixin_3980490…

深入理解Lock Support

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们要聊聊Lock Support。Lock Support是Java并发编程的一块基石&#xff0c;它提供了一种非常底层的线程阻塞和唤醒机制&#xff0c;是许多高级同步工具的基础。 为什么要关注Lock Support&#xff1f;线程…

七通道NPN 达林顿管GC2003,专为符合标准 TTL 而制造

GC2003 内部集成了 7 个 NPN 达林顿晶体管&#xff0c;连接的阵列&#xff0c;非常适合逻辑接口电平数字电路&#xff08;例 如 TTL&#xff0c;CMOS 或PMOS 上/NMOS&#xff09;和较高的电流/电压&#xff0c;如电灯电磁阀&#xff0c;继电器&#xff0c;打印机或其他类似的负…

Java项目:05 停车管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 课题意义&#xff1a; 随着时代和科技的进步&#xff0c;人们的生活水平越来越高&#xff0c;私家车的数量不断上涨&#xff0c;随之产生了一些问题&…