【二叉树的存储及遍历】

news2024/11/26 2:05:10

目录

  • 树的基本知识
    • 树的定义
    • 树的基本概念
    • 二叉树的性质
  • 二叉树的存储表示
    • 顺序存储(数组存储)
    • 链式表示
    • 二叉链表的静态结构(静态存储)
    • 结构体设计
  • 二叉树的遍历
    • 遍历思路
    • 代码

树的基本知识

树的定义

树是由n(n>=0)个结点组成的优先集合。如果n等于0,称为空树;但如果n>0,则
1)有一个特定称为根的结点,他只有直接后继,没有直接前驱。
2)除根节点之外的其他节点分为m(m>=0)个互不相交的有限集合,每个集合又是一棵树,并且称之为根的子树。每个子树的根结点有且只有一个直接前驱,但是可以有0个或多个直接后继。
在这里插入图片描述

树的基本概念

1.节点的度:一个结点含有子树的个数称为该结点的度
2.树的度:一棵树中,最大的结点的度称为树的度
3.叶节点或终端结点:度为0的结点
4.非终端结点或分支节点:度不为0的结点
5.父亲节点或父节点:若一个结点含有子节点,则称这个结点为其子节点的父节点
6.孩子节点或子节点:一个结点含有的子树的根结点称为该结点的子节点
7.兄弟节点:具有相同父节点的结点互称为兄弟结点
8.结点层次:从根开始定义起,根为第一层,根的子节点为第二层,以此类推
9.深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0
10.高度:对于任意结点n,n的高度为从n到一篇树叶的最长路径长,所有的树叶的高度为0
11.堂兄弟结点:父节点在同一层上的结点互为堂兄弟
12.结点的祖先:从根节点到该结点所经分支上的所有结点
13.子孙:以某节点为根的子树中任意一个结点都称之为该结点的子孙
14.森林:由m(m>=0)棵互不相交的树的集合称之为森林
15.树中任意节点的子节点之间没有顺序关系,这种树称之为无序树,也叫自由树,反之为有序树

二叉树的性质

  • 二叉树不同于树的特点是由一个根节点和两颗互不相交的,分别称为根节点的左子树和右子树的二叉树组成。
  • 若二叉树的层次从0开始,则二叉树的第i层最多有2^i个结点
  • 高度为k的二叉树,最多有2^(k+1)+1个结点
  • 对于任意一棵二叉树,如果叶子节点个数为n0,度数为2的非叶子结点个数为n2,则有n0=n2+1
  • 满二叉树:每一层的结点树都达到了最大值,则这个二叉树就是满二叉树
  • 完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
  • 具有n个结点的完全二叉树的高度为[log 2^(n+1)]-1.
    如果一棵树的左孩子和右孩子都是一颗满二叉树,那么他本身不一定是一颗满二叉树
    如果一棵树的左孩子和有孩子都是一棵完全二叉树,那么它本身也不一定是一棵完全二叉树

二叉树的存储表示

顺序存储(数组存储)

在这里插入图片描述
只适合存储满二叉树或者完全二叉树,否则就会存在空间浪费。

链式表示

在这里插入图片描述
这两类差别在于是否存在双亲指针,可以通过双亲指针快速回溯。

二叉链表的静态结构(静态存储)

在这里插入图片描述
llink表示左孩子,rlink表示有孩子,表格中的数据表示下标0表示不存在。例如A结点,左孩子下标为2,2号结点为B,右孩子为3号下标的C结点,所以A结点的左孩子为B,右孩子为C。

结构体设计

//三叉链表
typedef char ElemType;
typedef struct BtNode{
struct BtNode *leftchild;
struct BtNode *parent;
struct BtNode *rightchild;
ElemType data;
}BtNode,*BinaryTree;
//二叉链表
typedef char ElemType;
typedef struct BtNode{
struct BtNode *leftchild;
struct BtNode *rightchild;
ElemType data;
}BtNode,*BinaryTree;

二叉树的遍历

遍历思路

遍历的三种顺序:
先序:根左右
中序:左根右
后序:左右根
遍历规则:因为三种顺序遍历规则大同消息,此处用中序举例
1)若二叉树为空,则结束,
2)否则按顺序访问左子树 ,根节点,右子树。
在这里插入图片描述

我们以上图中的树做一中序遍历进行举例:首先从根节点开始遍历根结点A,接着遍历左孩子,左孩子又当作一整棵树,按根左右的顺序进行遍历,先遍历根节点B,下来遍历左孩子,把他整体看成一棵树,先根节点D,没有左右节点,开始回溯,B结点没有右节点又开始回溯到根节点,开始 遍历根节点的右孩子,同左孩子一样,把其右孩子当作一整棵树,先遍历根节点C,接着左孩子的根节点E,E没有左孩子,开始遍历右孩子G,G为叶子节点所以回溯,回溯到C,C遍历过了所以遍历其右孩子F即可结束。所以中序遍历顺序是ABDCEGF。

代码

BtNode* Buynode(){
	BtNode* s = (BtNode*)malloc(sizeof(BtNode));
	if (nullptr == s) {
		exit(1);
	}
	memset(s, 0, sizeof(BtNode));
	return s;
}
void PreOrder(BtNode* ptr) {
	if (ptr != nullptr) {
		printf("%c ", ptr->data);
		InOrder(ptr->leftchild);
		InOrder(ptr->rightchild);
	}

}
void InOrder(BtNode* ptr) {
	if (ptr != nullptr) {
		InOrder(ptr->leftchild);
		printf("%c ",ptr->data);
		InOrder(ptr->rightchild);
	}

}
void PastOrdor(BtNode* ptr) {
	if (ptr != nullptr) {
		InOrder(ptr->leftchild);
		InOrder(ptr->rightchild);
		printf("%c ", ptr->data);
	}

}
BtNode* CreatBtStr(const char* &str) {
	BtNode* s = nullptr;
	if (*str != '#') {
		s = Buynode();
		s->data = *str;
		s->leftchild = CreatBtStr(++str);
		s->rightchild = CreatBtStr(++str);
	}
	return s;
}
BtNode* CreatTreeStr(const char* str) {
	if (nullptr == str || strlen(str) <= 0) {
		return nullptr;
	}
	else return CreatBtStr(str);
}
int main() {
	const char* str = "ABC##DE##F##G#H##";
	BinaryTree root = CreatTreeStr(str);
	PreOrder(root);
	printf("\n");
	InOrder(root);
	printf("\n");
	PastOrdor(root);
	printf("\n");
	return 0;
}

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

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

相关文章

通用后台管理系统前端界面Ⅴ——axios使用与封装、配置路由和路由懒加载

axios使用与封装 1、下载axios npm i -S axios 2、在 main.js导入使用axios&#xff0c;因为是用的比较多&#xff0c;所以采用的是全局引入&#xff0c;挂载到原型的方式 import axios from axios Vue.prototype.axios axios // 挂载到原型,可在全局使用 配置路由 1、下载…

某30m小箱梁渠桥结构计算与施工图设计

目录 1、设计资料 1 1.1桥面净宽 1 1.2设计荷载 1 1.3主梁跨径和全长 1 1.4材料 1 1.5设计依据 1 1.6参考资料 1 2、任务与要求 1 2.1结构尺寸拟定 1 2.2行车道板计算 1 2.3主梁计算 1 2.4横梁的计算 2 3、结构尺寸拟定 2 4、 行车道板计算 3 4.1永久荷载及其效应 3 4.2截面设计…

Redis哨兵模式

什么是哨兵模式哨兵模式是Redis高可用的解决方案&#xff0c;使用Sentinel(哨兵)监控Redis集群中全部节点的运行状态&#xff0c;当主节点服务宕机后&#xff0c;会从当前主节点下的从节点中选一个节点作为新的主节点&#xff0c;继续为用户提供服务。当原主节点重新启动后&…

个人博客类网站为什么更适合虚拟主机?

对于各位站长来说&#xff0c;建立网站有多种主机选项可以选择&#xff0c;比如&#xff0c;虚拟主机、云主机&#xff0c;物理机等。那么为什么说个人博客类网站更适合选用虚拟主机而不是其他类型的主机呢? 个人博客类网站更适合虚拟主机的理由&#xff1a; 首先&#xff0c;…

基于STM32结合CubeMX学习Free-RT-OS的源码之两类中断解析

目录 认识 常见的中断应用场景 进入与退出临界区&#xff08;开中断与关中断&#xff09; Free RTOS的systick中断 和 PendSV中断。 Cortex-M3/4的工作模式以及双堆栈指针MSP和PSP(CPU与OS的相辅相成与互相成就&#xff09; 为什么要引入这两种工作状态&#xff1f; 为什么…

Debian Linux 的安装

Debian Linux 的安装 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;Debian Linux 的安装 CSDN&#xff1a;Debian Linux 的安装 说明 本安装说明是基于 Windows 10 下 VMware workstation 16 安装 Linux&#xff0c;Linux 版本是 Debian 11&#xff0c;需…

K8s集群环境搭建

K8s集群环境搭建 修改hosts文件 [rootmaster ~]# vim /etc/hosts [rootmaster ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.…

TCO点击试剂(4E)-TCO-PEG4-amine, 2243569-24-4,反式环辛烯-四聚乙二醇-氨基

【产品描述】 (4E)-反式环辛烯-四聚乙二醇-氨基&#xff0c;胺与活性NHS酯或在活化剂suh&#xff08;如EDC&#xff09;存在下与羧酸非常反应&#xff0c;TCO部分使四嗪分子实现快速点击化学。亲水性PEG间隔臂提高了水溶性&#xff0c;并提供了一个长而灵活的连接。西安凯新生物…

软件测试的几种模型

1.V模型 在软件测试方面&#xff0c;V模型是最广为人知的模型。如图&#xff0c;V模型从左到右描述了开发过程和测试行为。V模型的价值在于它非常明确的表明了测试过程中存在的不同级别&#xff0c;并且清楚的描述了这些测试阶段和开发过程各阶段的对应关系。缺点&#xff1a;把…

Selenium基础 — POM设计模式(一)

&#xff08;一&#xff09;POM模式介绍 1、什么是POM&#xff1f; POM是Page Object Model页面对象模型的简称。 POM是为Web UI元素创建Object Repository的设计模式 。 在这个模型下&#xff0c;对于应用程序中的每个网页&#xff0c;应该有相应的页面类。 此Page类将会找到…

ES新特性与TypeScript、JS性能优化

一、ECMAScript 新特性 1、作用域 1、全局作用域 2、函数作用域 3、块级作用域2、var、let和const的区别 1、let和var用来声明变量&#xff0c;const用来声明常量&#xff08;变量就是赋值后可以改变它的值&#xff0c;常量就是赋值后就不能改变它的值&#xff09; 2、const…

Unity 资源热更新

热更新流程 启动游戏根据当前版本号&#xff0c;和平台号去版本服务器上检查是否有热更从热更服务器上下载md5文件&#xff0c;比对需要热更的具体文件列表从热更服务器上下载需要热更的资源&#xff0c;解压到热更资源目录游戏运行加载资源&#xff0c;优先到热更目录中加载&…

windows下载redis、windows安装redis、windows启动redis

一、下载并解压 下载网址&#xff1a;https://github.com/tporadowski/redis/releases 下载后解压并重命名文件夹为redis 二、打开redis文件夹 找到redis.windows.conf配置文件&#xff0c;作如下修改 protected-mode no // 将yes改为no 部分配置信息说明 bind 127.0.…

Ubuntu服务器下安装FastDFS及nginx配置访问等问题记录

Ubuntu服务器下安装FastDFS及nginx配置访问下载对应包编译环境包解压环境配置配置nginx模块和安装nginx来进行访问该图片下载对应包 下载方式一&#xff1a;直接使用 wget 下载&#xff0c;如果太慢&#xff0c;可以去github下载&#xff0c;然后上传到服务器上即可。 wget -…

Mybatis三大执行器介绍

Mybatis三大执行器介绍Mybatis相关全览一、执行器介绍执行器的选择入口设置执行器两种方式全局配置&#xff08;不建议&#xff09;局部设置&#xff08;建议&#xff09;二、三个执行器区别SimpleExecutorReuseExecutorBatchExecutor总结三、效率测试四、平时开发使用本文用的…

老机器摇身一变成局域网下低配服务器,并稳定访问GitHub

老机器摇身一变成局域网下低配服务器&#xff0c;并稳定访问GitHub 搭建场景&#xff1a; 问题背景&#xff1a; 最近用腾讯云服务器访问GitHub经常挂&#xff0c;试了很多解决方案如换host文件ip等办法提速效果都不明显。后来想通过腾讯云服务器实现kexueshangwang&#xff0…

wechaty-puppet-whatsapp的uos协议使用中常见问题

常见问题 常见问题解决基本方案 先检查node版本是否大于16确认npm已经配置好淘宝源存在package-lock.json文件先删除删除node_modules后重新执行npm install 或cnpm install配置文件是否按照要求设置本地网络是否存在限制&#xff0c;是否开启了代理服务本地防火墙是否关闭 我…

智能微型断路器的功能有哪些?和网关搭配的作用在哪?

安科瑞 华楠 ASCB1 系列智能微型断路器是安科瑞电气股份有限公司 全新推出的智慧用电产品&#xff0c;产品由智能微型断路器与智 能网关两部分组成&#xff0c;可用于对用电线路的关键电气因 素&#xff0c;如电压、电流、功率、温度、漏电、能耗等进行实 时监测&#xff0c;具…

[附源码]java毕业设计剧本杀门店管理系统-

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

三种常规用的矢量网络分析仪系统误差校准方法

我们在使用矢量网络分析仪是会发现测量出来的数据有误差&#xff0c;要想矫正&#xff0c;首先我我们要知道矢量网络分析仪的误差来源有哪些?主要有以下三个方面&#xff1a;漂移误差、随机误差、系统误差 1、漂移误差&#xff1a;是由于进行校准之后仪器或测试系统性能发生变…