【二叉树——数据结构】

文章目录

      • 1.二叉树
          • 1.基本概念.
          • 几种特殊的二叉树
      • 2.考点
      • 3.二叉树的存储结构
      • 4.二叉树的遍历
      • 5.线索二叉树

1.二叉树

1.基本概念.

在这里插入图片描述
二叉树是n(n>=0)个结点的有限集合
或者为空二叉树,即n=0
或者由一个根结点和两个互不相交的被称作根的左子树和右子树组成。
每个结点至多只有两棵子树
左右子树不能颠倒(二叉树是有序树)
二叉树是递归定义的数据结构
树转化为二叉树:左孩子,右兄弟

几种特殊的二叉树

1.满二叉树
在这里插入图片描述
在这里插入图片描述
特点

  1. 只有最后一层有叶子结点
  2. 不存在度为1的结点
  3. 按层序从1开始编号,结点i的左孩子为2i,右孩子为2i+1;结点i的父节点为i/2 (如果存在的话)

2.完全二叉树
在这里插入图片描述当且仅当其每个结点都与高度为h的满二叉树中编号为1-n的结点一-对应, 称为
完全二叉树
特点

  1. 只有最后两层可能有叶子结点
  2. 最多只有一 个度为1的结点
  3. 按层序从1开始编号,结点i的左孩子为2i,右孩子为2i+1;结点i的父节点为[i/2] (如果存在的话)
  4. i<=n/2为分支结点,i≥n/2为叶子结点
  5. 如果某个节点只有一个孩子, 那这个孩子一定是左孩子

3. 二叉排序树
在这里插入图片描述
左子树上所有结点的关键字均小于根节点的关键字;右节点上所有结点的关键字均大于根节点的关键字,左子树和右子树又各是一棵二叉排序树。
用于元素的排序,搜索
4.平衡二叉树
在这里插入图片描述
树上任一结点的左子树和右子树的深度之差不超过1
平衡二叉树能有更高的搜索效率

2.考点

  1. 设非空二叉树中度为0、1和2的结点个数分别为n0,n1和n2, 则n0 = n2+ 1
    (叶子结点比二分支结点多一个)
  2. 二叉树第i层至多有2^(i-1)个结点(i≥1)
  3. 高度为h的二叉树至多有2^h - 1个结点(满二叉树)
  4. 具有n个(n> 0)个结点的完全二叉树的高度h为[log(n + 1)]或[log n]+1
    编号为i的结点所在层次为[log(i + 1)]或[log i]+1
  5. 对于完全二叉树,可以由结点数推出度为0, 1和2的结点个数为n0,n1和n2
  6. 若完全二叉树有2k个(偶数)个结点,则必有n1=1, n0=k, n2= k-1
    若完全二叉树有2k-1个(奇数)个结点,则必有n1=0,n0=k, n2= k-1

3.二叉树的存储结构

顺序存储

#define MaxSize 100
struct TreeNode {
	ElemType value; //结点中的数据元素
	bool isEmpty; //结点是否为空
};
TreeNode t [MaxSize] ;

只适合存储完全二叉树

链式存储

//二又树的结点(壁式存储)
typedef struct BiTNode(
	ELemType data;//数据域
	struct BiTNode *lchld,rchild;//左、右孩子指针
}BiTNode,*BTree;

在这里插入图片描述
n个结点的二叉链表共有n+ 1个空链域

4.二叉树的遍历

按照某种次序把所有节点都访问一遍

先序遍历——O(n)
根左右
得到前缀表达式

中序遍历——O(n)
左根右
得到中缀表达式(未加界限符)

后序遍历——O(n)
左右根
得到后缀表达式

求树的深度

int treeDepth(BiTree T){
	if (T == NULL) {
		return 0;
	}
	else {
		int 1 = treeDepth(T->lchild);
		int r = treeDepth(T->rchild);
		//树的深度=Max(左子树深度,右子树深度)+1
		return l>r ? 1+1 : r+1;
	}
}

层次遍历

  1. 初始化一个辅助队列
  2. 根节点入队
  3. 若队列非空,则队头结点出队,访问该结点,并将其左右孩子插入队尾(如果有的话)
  4. 重复上一步直至队列为空
//层序遍历
void Levelorder(BiTree T){
	LinkQueue Q;
	InitQueue(Q) ;	//初始化辅助队列
	BiTree p;
	EnQueue(Q,T);	//将根结点入队
	while( !IsEmpty(Q)){	//队列不空则循环
		DeQueue(Q,p);	//队头结点出队
		visit(p);	//访问出队结点
		if(p- >lchild!=NULL)
			EnQueue(Q, p- >lchild); //左孩子入队
		if(p->rchild!=NULL)
			EnQueue(Q,p >rchild); //右孩子入队
	}
}
//二叉树的结点(链式存储)
typedef struct BiTNode{
	char data;
	struct BiTNode *lchild, 电rchild;
}BiTNode, *BiTree;
//链式队列结点
typedef struct LinkNode{
	BiTNode * data;
	struct LinkNode *next;
}LinkNode;
typedef struct{
	LinkNode *front, *rear; //队头队尾
}LinkQueue;

由遍历序列构造二叉树
若只给出-一个二叉树的前/中/后/层序遍历队列中的一-种,不能唯- -确定-棵二叉树
前序+中序遍历队列
后序+中序遍历队列
层序+中序遍历队列

前序、后序、层序
序列的两两组合无法唯一
确定一棵二叉树

5.线索二叉树

线索二叉树的作用——方便从一个指定结点出发,找到其前驱、后继;方便遍历线索二叉树的存储结构

//线索二叉树结点
typedef struct ThreadNode{
	ElemType data;
	struct ThreadNode *lchild, *rchild; 
	int ltag, rtag; //左、 右线索标志
}ThreadNode ,*ThreadTree ;
//*Ichild | Itag | data | rtag  |*rchild
//tag==0,表示指针指向孩子
//tag==1,表示指针是"线索"

三种线索二叉树

  1. 先序线索二叉树——线索指向、 先序前驱、先序后继
    在这里插入图片描述

  2. 中序线索二叉树——线索指向、中序前驱、中序后继
    在这里插入图片描述

  3. 后序线索二叉树——线索指向、后序前驱、后序后继
    在这里插入图片描述
    二叉树的线索化
    中序线索化得到中序线索二叉树
    先序线索化-得到先序线索二叉树
    后序线索化得到后序线索二叉树
    核心
    中序/先序/后序遍历算法的改造,当访问一个结点时,连接该结点与前驱结点的线索信息
    用一个指针pre记录当前访问结点的前驱结点

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

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

相关文章

Linux系统编程——操作系统的初步认识(Operator System)

目录 一&#xff0c;关于操作系统 二&#xff0c;计算机的层次设计 2.1 硬件层 2.2 驱动层 2.3 操作系统层 2.4 用户层 2.5 系统调用接口 2.6 用户调用接口 三&#xff0c;操作系统管理的精髓 —— 先描述&#xff0c;再组织 3.1 什么是先描述&#xff1f; 3.2 什么…

php反序列化以及相关例题

目录 一、什么是序列化和反序列化&#xff1f; 二、相关函数 serialize()函数&#xff1a; unserialize()函数&#xff1a;反序列化 三、PHP序列化格式 四、序列化与反序列化的作用 五、各种数据类型序列化后的效果 六、魔术方法 七、反序列化的一些绕过 八…

国家开放大学《TRIZ技术创新方法应用培训》形考任务和终考任务作业参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 参考答案包含 形考任务项目报告、终考任务 、单元测试、随…

【IDEA】IDEA自带Maven/JDK,不需要下载

IDEA是由Java编写的&#xff0c;为了保证其运行&#xff0c;内部是自带JDK的。IDEA 2021 及 之后的版本是自带Maven的&#xff1a; 视频连接&#xff1a; https://www.bilibili.com/video/BV1Cs4y1b7JC?p4&spm_id_frompageDriver&vd_source5534adbd427e3b01c725714cd…

LeetCode 105.从前序与中序遍历构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,nul…

【Oracle】python调取oracle数据教程

目录 &#xff08;1&#xff09;安装python和相关库 1.python的下载和安装 2.python安装cx_Oracle库和pandas库 3.本机安装instantclient 数据库客户端 先安装instantclient 然后设置环境变量 &#xff08;2&#xff09;准备好连接Oracle数据库地址等五项信息 &#xf…

C++的演变与未来:编程艺术的持续进化

在计算机编程的演变历程中&#xff0c;C以其独特的魅力和强大的功能&#xff0c;一直占据着不可或缺的地位。从最初的面向对象编程&#xff0c;到如今的跨平台、高性能应用&#xff0c;C在不断地适应和推动着计算机技术的发展。本文将深入剖析C的演变过程&#xff0c;展望其未来…

深入探索 C++ 中 string 的用法:从基础到实践

C String 用法详解 C中的 std::string 是一个非常强大且灵活的类&#xff0c;用于处理字符串。std::string 类是C标准库中的一部分&#xff0c;它提供了丰富的成员函数来执行各种字符串操作&#xff0c;如连接、比较、查找、替换等。在本篇博客中&#xff0c;我们将深入探索 s…

张大哥笔记:学什么都不如学赚钱

很多人总是这样认为&#xff1a;好好读书&#xff0c;考上好学校&#xff0c;将来可以找到一份不错的工作&#xff0c;这样的思想观念&#xff0c;可能会导致你一辈子都无法实现财富自由。 财富的多少&#xff0c;和你的努力程度没有直接关系。我们可以清楚看到那些每天辛苦劳动…

【Linux 系统】进程信号 -- 详解

⚪前言 注意&#xff1a;进程间通信中的信号量跟下面要讲的信号没有任何关系。 一、从不同角度理解信号 1、生活角度的信号 你在网上买了很多件商品&#xff0c;在等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临时&#xff0c;你该怎么处理快递&a…

《MySQL对库的基本操作》

文章目录 一、查看数据库列表查看数据库中的所有表想知道当前处于哪个数据库里 二、创建一个数据库三、删除一个数据库知道两个集1.字符集2.校验集修改数据库的字符集和编码集 不同的校验码对数据库的影响四、数据库的备份与恢复注意事项&#xff1a;备份数据库中的表 总结 一、…

HTTP/1.1、HTTP/2、HTTP/3 的演变

HTTP/1.1、HTTP/2、HTTP/3 的演变 HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f;HTTP/2 做了什么优化&#xff1f;HTTP/3 做了哪些优化&#xff1f; HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接的…

Python 在windows环境下加密文件成.pyd格式

首先 pip install easycython然后打开在要加密的文件同一目录下cmd命令框&#xff0c;命令行里键入 easycython 你要加密的文件.py 最后会在目录下看见有个.pyd的文件&#xff0c;只保留这个文件&#xff0c;剩下的都删了&#xff0c;其他引用该文件的python文件该咋用咋用。…

AI泳池溺水监测识别摄像机

AI泳池溺水监测识别摄像机是一种利用人工智能和机器视觉技术的创新设备&#xff0c;旨在确保游泳池安全&#xff0c;并及时识别溺水事件&#xff0c;以减少溺水事故的发生。这种摄像机利用高清摄像头和AI算法&#xff0c;能够实时监测泳池中的情况&#xff0c;并自动识别溺水事…

Redis---------实现短信登录业务

目录 基于Session的短信登录 ①首先看他的业务逻辑 ②进行代码逻辑处理 基于Redis的短信登录 ①首先看他的业务逻辑 ②进行代码逻辑处理 Controller&#xff1a; Service接口&#xff1a; Service实例&#xff1a; Mapper&#xff1a; 封装ThreadLocal线程的数据操作&#x…

Sublime Vim模式配置:q关闭当前标签页

在Sublime安装目录下的->Packages文件夹下新建User文件夹创建文件Vintage.sublime-commands 路径为Sublime安装目录->Packages->User->Vintage.sublime-commands文件内容如下[{"caption": ":w - Save","command": "save"}…

天地图路径规划功能实现

目录 1、天地图路径规划2、路径规划3、参数说明4、Demo 1、天地图路径规划 天地图Web服务API为用户提供HTTP/HTTPS接口&#xff0c;即开发者可以通过这些接口使用各类型的地理信息数据服务&#xff0c;可以基于此开发跨平台的地理信息应用。 Web服务API对所有用户开放。使用本…

【综述】多核处理器芯片

文章目录 前言 Infineon处理器 AURIX™系列 TC399XX-256F300S 典型应用 开发工具 参考资料 前言 见《【综述】DSP处理器芯片》 Infineon处理器 AURIX™系列&#xff0c;基于TriCore内核&#xff0c;用于汽车和工业领域。 XMC™系列&#xff0c;基于ARM Cortex-M内核&…

【LAMMPS学习】八、基础知识(5.3)Body particles体粒子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

python笔记:gensim进行LDA

理论部分&#xff1a;NLP 笔记&#xff1a;Latent Dirichlet Allocation &#xff08;介绍篇&#xff09;-CSDN博客 参考内容&#xff1a;DengYangyong/LDA_gensim: 用gensim训练LDA模型&#xff0c;进行新闻文本主题分析 (github.com) 1 导入库 import jieba,os,re from ge…