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

news2024/9/25 15:25:30

数据结构学习笔记---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

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

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

相关文章

考研复试复习-数据库原理(2关系数据库)

一、关系数据模型 1、关系数据结构 (1) 域、笛卡尔积、关系 笛卡尔积实际上可以看成是n个行向量&#xff0c;即&#xff08;域&#xff09;&#xff0c;所组成的一个乘法算式&#xff0c;每一个行向量是一个Di&#xff0c;所有行向量逻辑上组合在一起就是D&#xff0c;就是一…

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统&#xff0c;linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk&#xff0c;我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…

数据库-数据结构

数据库-数据结构 一、B-树、B树、B*树1 B-树2 B树3 B*树 一、B-树、B树、B*树 搜索树&#xff1a;左子节点<节点<右子节点。 B-树&#xff1a;多路搜索树。 B树&#xff1a;B-树的变体&#xff0c;更适用于文件系统&#xff0c;如mysql数据库。具体的&#xff0c;适合通…

SAP SQVI制作报表及SE93创建事务代码

在平时的项目中&#xff0c;财务想查询所有的凭证明细&#xff0c;SAP的查询凭证FB03不能满足需求&#xff0c;所以用SQVI制作一个简易的查询报表。 1、打开SQVI&#xff0c;填写自开发报表的名称“ZFB03”&#xff0c;点击“创建”&#xff0c;输入自开发报表的名称“凭证明细…

腾讯云免费服务器-多规格高配服务器0元试用,开箱即用

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

小程序开发哪家公司好呢?

现在的小程序开发公司还是很多的&#xff0c;不同的开发公司的开发情况会有所不同 智创有术 国内定制开发行业的佼佼者&#xff0c;曾服务过众多知名企业&#xff0c;包括沃尔玛、富士康、百度、美的等多家五百强企业。他们提供移动应用开发、Web开发、云计算和UI/UX设计等服…

2024年百元到千元价位开放式耳机推荐,性价比最高的开放式耳机

一、前言 近年来&#xff0c;开放式耳机在人们对音频体验的追求中逐渐受到重视&#xff0c;成为越来越多人的选择。然而&#xff0c;随着网络上关于开放式耳机的讨论不断增加&#xff0c;相关的争议和观点层出不穷。很多人可能心生疑虑&#xff1a;开放式耳机究竟是提升音质还…

2.右值引用和移动语义

文章目录 右值引用和移动语义&&的特性右值引用优化性能&#xff0c;避免深拷贝移动(move )语义forward 完美转发emplace_back 减少内存拷贝和移动unordered container 无序容器map和unordered_map的差别内部实现机理不同优缺点以及适用处 小结优缺点以及适用处 小结 代…

激光雷达产品调研

Lidar产品调研 Lidar原理介绍

探索 C# 中的程序运行目录获取方法

探索 C# 中的程序运行目录获取方法 引言 在 C# 开发中&#xff0c;有时需要确定您的应用程序的运行目录。这可能是为了读取配置文件、存储日志&#xff0c;或者访问与应用程序位于同一目录的其他资源。C# 提供了几种方法来获取当前程序的运行目录。本文将探讨这些方法及其使用…

[Altium Designer] AD PCB相同模块的布局步骤

针对原理图完全相同的模块布局布线很有帮助&#xff1b;一定要对应模块相同操作才具有可行性。 1、原理图中选取一路模块的元器件&#xff0c;快捷键【T→S】即可在对应的PCB中选取对应的元器件&#xff1b;跳转到PCB&#xff0c;快接方式改变右边属性&#xff0c;【ctrla】 …

【InternLM 大模型实战】第四课

XTuner 大模型单卡低成本微调实战 FINETUNE简介指令跟随微调增量预训练微调LoRA & QLoRA XTuner简介功能亮点适配多种生态适配多种硬件 8GB 显卡玩转LLMFlash AttentionDeepSpeed ZeRO 动手实战环节环境配置微调准备配置文件模型下载数据集下载修改配置文件开始微调将得到的…

使用python连接elasticsearch

有一个困惑了好久的问题&#xff0c;那就是从python里面连接elasticsearch总是报错。大致长这样 一开始我是看网上把es的安全功能关闭&#xff0c;也就是下面的内容&#xff0c;这个要进入到es的docker中去改config/elasticsearch.yml配置文件&#xff0c;但是这样改了以后kib…

【origin】负载牵引的Smith圆图

【origin】负载牵引的Smith圆图 1.从ADS导入数据到origin2.smith圆图3.扩展到多组线4.参考资料 1.从ADS导入数据到origin export导出为txt&#xff0c;得到的是幅相值&#xff0c;复制到excel如下图&#xff0c;有多根类似格式的线&#xff0c;只需要复制DE列到origin中 复制到…

单主机双屏幕实现跨屏幕信息交互的GUI程序

单主机双屏幕实现跨屏幕信息交互的GUI程序 运行程序界面 屏幕1发送数据&#xff0c;屏幕2接收数据 在屏幕1按下打开开关&#xff0c;屏幕2播放视频 代码程序 import tkinter as tk # 导入tkinter模块&#xff0c;用于创建GUI界面 import threading # 导入threading模块&#…

智能雾化壁炉设计,新时代科技与美学的完美结合

智能雾化壁炉设计&#xff0c;新时代科技与美学的完美结合 随着科技的不断创新&#xff0c;智能雾化壁炉设计成为家居设计领域的一颗耀眼明珠。它的出现不仅改变了传统壁炉的概念&#xff0c;更为我们带来了全新的视觉和感官体验。下面让我们一起探索智能雾化壁炉设计的优势和特…

企业网盘:实现数据跨境传输,助力企业出海的必备工具

今年是“一带一路”十周年。在这十年间&#xff0c;中国和“一带一路”共建国家携手并行&#xff0c;贸易持续增长发展。在如今经济全球化的大方向下&#xff0c;跨国经济合作将会是各国共识。 目前&#xff0c;中外合作企业、跨境企业已成为国际贸易发展趋势。不过&#x…

腾讯滑块(1-13,js逆向)

前言&#xff1a;之前打算写的猿人学比赛题系列因为种种原因耽搁了&#xff0c;主要还是比完赛之后热情就少了很多&#xff0c;看到评论区有人说做了这么久才做出一题&#xff0c;这里需要狡辩一下&#xff0c;我虽然菜但是还没到那种地步&#xff0c;比赛两天时间里我跟队友是…

mac快捷创建文件的方法

mac快捷创建文件的方法 在macbook的使用中&#xff0c;当我们在桌面或访达等地方使用右键时&#xff0c;可以看到新建文件夹的选项&#xff0c;却怎么也找不到创建文件的选项。这种情况有时候会带来不便。这篇文章给大家带来一个非常简单解决这个问题。 下载 在App Store中搜索…

FPGA的MARK_DEBUG调试之波形抓取

一、描述 在工作时发现FPGA向ARM传输的数据有问题&#xff0c;因此想抓取一下FPGA的波形。作为传统方式使用示波器抓取过于麻烦&#xff0c;因此使用VIVADO自带的DEBUG功能抓取输出的数据波形。 先上几个比较好的学习链接&#xff1a; https://www.cnblogs.com/tubujia/p/924…