算法入门 | 二叉树的递归遍历、递归创建系列(递归)

news2024/9/27 9:20:15

目录

1. 二叉树的遍历规则

2. 二叉树的结构体设计 【leftchild  data  rightchild】

3. 二叉树的递归先序、中序、后序遍历

4. 利用已知字符串(二叉树的先序序列)递归创建一棵二叉树

(1)购买节点函数

(2)创建二叉树

5. 使用先序遍历序列和中序遍历序列创建一棵二叉树

6. 使用中序遍历序列和后序遍历序列创建一棵二叉树

 7. 对二叉树的物理存储数组进行递归先序、中序、后序遍历


1. 二叉树的遍历规则

先序遍历: -> 左 -> 右;中序遍历: 左 -> -> 右;后序遍历:左 -> 右 ->

2. 二叉树的结构体设计 【leftchild  data  rightchild】

typedef char ELEMTYPE;//typedef给char类型起别名ELEMTYPE
//二叉树结构体设计
typedef struct BtNode
{
	struct BtNode* leftchild;
	ELEMTYPE data;
	struct BtNode* rightchild;
}BtNode,* PBtNode;

3. 二叉树的递归先序、中序、后序遍历

void PreOrder(struct BtNode* ptr) //先序遍历(根左右)
{
	if (nullptr == ptr) return;
	printf("%3c", ptr->data);
	PreOrder(ptr->leftchild);
	PreOrder(ptr->rightchild);
}
void InOrder(struct BtNode* ptr) //中序遍历(左根右)
{
	if (nullptr == ptr) return;
	InOrder(ptr->leftchild);
	printf("%3c", ptr->data);
	InOrder(ptr->rightchild);
}
void LastOrder(struct BtNode* ptr) //后序遍历(左右根)
{
	if (nullptr == ptr) return;
	LastOrder(ptr->leftchild);
	LastOrder(ptr->rightchild);
	printf("%3c", ptr->data);
}

4. 利用已知字符串(二叉树的先序序列)递归创建一棵二叉树

(1)购买节点函数

struct BtNode* Buynode()
{
	BtNode* s = (BtNode*)malloc(sizeof(BtNode));
	if (s == nullptr) exit(1);
	memset(s, 0, sizeof(BtNode));//此处不要写sizeof(s),由于指针永远为4bit(32bit系统下)
	return s;
}

(2)创建二叉树

注意:函数参数为引用!!确保每次递归时传参是对同一字符串前置++

BtNode* CreateBT(const char*& str)//参数为引用!!是由于递归时传参为++str~为了保证每次++同步执行(即在同一个字符串序列)
{
	//根据先序序列创建树~根左右
	if (str == nullptr || strlen(str) <= 0) return nullptr;//空树
	BtNode* s = nullptr;
	if (*str != '#')
	{
		s = Buynode();
		s->data = *str;//根
		s->leftchild = CreateBT(++str);//左
		s->rightchild = CreateBT(++str);//右
	}
	return s;
}
int main()
{
	const char* str = "ABC##DE##F##G#H##";
	BtNode* s=CreateBT(str);
	PreOrder(s);
	printf("\n");
	InOrder(s);
	printf("\n");
	LastOrder(s);
	printf("\n");
	return 0;
}

运行结果如图:

5. 使用先序遍历序列和中序遍历序列创建一棵二叉树

//根据先序遍历+中序遍历创建一棵二叉树
int Find(const char* istr, int n, char str) //中序序列中找根对应的下标
{
	int pos = -1;
	for (int i = 0; i < n; ++i)
	{
		if (istr[i] == str)
		{
			pos = i;
			break;
		}
	}
	return pos;
}
BtNode* CreatePITree(const char* pstr, const char* istr, int n)//此处n代表规模
{
	BtNode* s = nullptr;
	if (n > 0)
	{
		s = Buynode();
		s->data = pstr[0];//先序首位为根
		int pos = Find(istr, n, pstr[0]);//中序序列中找根对应的下标
		if (pos == -1) exit(1);
		s->leftchild = CreatePITree(pstr+1,istr,pos);
		s->rightchild = CreatePITree(pstr+pos+1,istr+pos+1,n-pos-1);
	}
	return s;
}
BtNode* CreatePIT(const char* pstr, const char* istr)
{
	int n = strlen(pstr);
	int m = strlen(istr);
	if (pstr == nullptr || istr == nullptr || n < 1 || m < 1 || n != m) return nullptr;
	else return CreatePITree(pstr, istr, n);
}

int main()
{
	//const char* str = "ABC##DE##F##G#H##";
	//BtNode* s=CreateBT(str);
	const char* pstr = "ABCDEFGH";
	const char* istr = "CBEDFAGH";
	BtNode* s = CreatePIT(pstr, istr);
	PreOrder(s);
	printf("\n");
	InOrder(s);
	printf("\n");
	LastOrder(s);
	printf("\n");
	return 0;
}

6. 使用中序遍历序列和后序遍历序列创建一棵二叉树

//根据中序遍历+后序遍历创建一棵二叉树
BtNode* CreateILTree(const char* istr, const char* lstr, int n)//此处n代表规模
{
	BtNode* s = nullptr;
	if (n > 0)
	{
		s = Buynode();
		s->data = lstr[n - 1];//后序遍历的最后一个为根
		int pos = Find(istr, n, lstr[n - 1]);
		s->leftchild = CreateILTree(istr,lstr,pos);
		s->rightchild = CreateILTree(istr+pos+1,lstr+pos,n-pos-1);
	}
	return s;
}
BtNode* CreateILT(const char* istr, const char* lstr)
{ 
	int n = strlen(istr);
	int m = strlen(lstr);
	if (nullptr == istr || nullptr == lstr || n < 1 || m < 1 || n != m) return nullptr;
	else return CreateILTree(istr, lstr, n);
}

int main()
{
	//const char* str = "ABC##DE##F##G#H##";
	//BtNode* s=CreateBT(str);
	const char* pstr = "ABCDEFGH";
	const char* istr = "CBEDFAGH";
	const char* lstr = "CEFDBHGA";
	//BtNode* s = CreatePIT(pstr, istr);
	BtNode* s = CreateILT(istr, lstr);
	PreOrder(s);
	printf("\n");
	InOrder(s);
	printf("\n");
	LastOrder(s);
	printf("\n");
	return 0;
}

 7. 对二叉树的物理存储(数组)进行递归先序、中序、后序遍历

主要依据:二叉树的物理存储对应逻辑存储的关系。

二叉树物理下标为i:其左孩子对应下标为i*2+1;其右孩子对应下标为i*2+2

 

//对二叉树的物理存储数组进行递归先序、中序、后序遍历
void PreOrder(const int* nums, int i, int n)//遍历规模:i~n
{
	if (i < n && nums[i] != -1) //i==n时规模为1
	{
		printf("%3d", nums[i]);//根
		PreOrder(nums, i * 2 + 1, n);//左 左子树下标:i*2+1
		PreOrder(nums, i * 2 + 2, n);//右
	}
}
void InOrder(const int* nums, int i, int n)
{
	if (i < n && nums[i] != -1)
	{
		InOrder(nums, i * 2 + 1, n);//左
		printf("%3d", nums[i]);//根
		InOrder(nums, i * 2 + 2, n);//右
	}
}
void LastOrder(const int* nums, int i, int n)
{
	if (i < n && nums[i] != -1)
	{
		LastOrder(nums, i * 2 + 1, n);//左
		LastOrder(nums, i * 2 + 2, n);//右
		printf("%3d", nums[i]);//根
	}
}
int main()
{
	const int nums[] = {31,23,12,66,-1,5,17,70,62,-1,-1,-1,88,-1,55};
	int n = sizeof(nums) / sizeof(nums[0]);
	PreOrder(nums, 0, n);
	printf("\n");
	InOrder(nums, 0, n);
	printf("\n");
	LastOrder(nums, 0, n);
	printf("\n");
	return 0;
}

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

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

相关文章

【附源码】计算机毕业设计JAVA移动学习网站

【附源码】计算机毕业设计JAVA移动学习网站 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

阻止网络钓鱼诈骗的技巧

根据 Verizon 的2022 年数据泄露调查报告&#xff0c;25% 的数据泄露始终涉及网络钓鱼。 这是怎么发生的&#xff1f;参与网络钓鱼的欺诈者往往是一些掌握发文技巧的内容作者。他们知道如何创造一种紧迫感&#xff0c;让您点击通知并阅读消息。 很多用户落入了他们的陷阱&…

录屏软件哪个好?比较好用的录屏软件,这4款值得一试!

​现在很多人都会使用录屏软件&#xff0c;有些用来录制游戏里的精彩操作&#xff0c;有些用来录制线上的教学课程&#xff0c;有些用来录制在线视频会议。如今录屏软件种类繁多。选择一个好的录屏软件十分重要。录屏软件哪个好&#xff1f;比较好用的录屏软件有哪些&#xff1…

Zebec开启多链布局,流支付生态持续扩张

随着 Do Kwon 的Terra 以及 Sam Bankman-Fried 的 FTX&#xff0c;这两个加密行业的“庞大帝国”轰然倒塌后&#xff0c;Terra生态毁于一旦&#xff0c;而辉煌一时的Solana生态也失去了“靠山”&#xff0c;尤其是在Solana屡次宕机、在FTX危机时增发SOL代币后&#xff0c;进一步…

骨传导耳机会损伤大脑吗?一分钟详细了解骨传导耳机

骨传导耳机会损伤大脑吗&#xff1f;这个问题一直都有很多人在问&#xff0c;相对传统入耳式耳机来说&#xff0c;骨传导耳机更能保护我们的听力与大脑&#xff0c;骨传导耳机的工作原理跟传统耳机不一样&#xff0c;它不会损伤到大脑&#xff0c;下面我来跟大家说一下骨传导耳…

Python: 10大Web框架简介

文章目录简介一、Web 框架三大分类**1. 全栈框架****2.微框架****3.异步框架**二、Python Web 框架的优点三、十大 Python Web 开发框架1.Django2. Flask3.CherryPy4.Pyramid5. Grok6.Turbogears7.Zope38. Bottle9.Web2py10. Tornado小结简介 在这篇文章中了解一些可供您使用的…

dolphinscheduler-data-quality-3.1.0 部署

前提条件 dophinscheduler-3.1.0 安装 standalone-server 模式&#xff0c;参考 https://blog.csdn.net/windydreams/article/details/127678233 编译数据质量源码 为了保障后期正常运行&#xff0c;简化配置&#xff0c;可以进行以下配置 1&#xff09;添加资源文件src/mai…

疫情之下,企业如何才能高效的进行异地协同办公?

随着经济社会的飞速发展再加上现在疫情反反复复的出现&#xff0c;很多公司的业务不再受地域的限制&#xff0c;所以出差就成了很多职场人士的家常便饭&#xff0c;而这一现象也加剧了异地办公模式的兴起&#xff0c;因为即便身处异地&#xff0c;也需要及时向领导汇报工作进度…

防爆定位信标与防爆定位基站有什么区别?

防爆定位信标与防爆定位基站都是组成人员定位系统的硬件设备。一套完整的人员定位系统由硬件设施和软件系统组成&#xff0c;其中硬件设施包括人员定位卡、防爆定位信标和防爆定位基站。 在大数据、信息化时代&#xff0c;基于蓝牙LoRa定位技术的融合定位系统&#xff0c;让我们…

2008-2020年全国各省劳动生产率

2008-2020年全国各省劳动生产率 1、包括&#xff1a;全国31省 2、来源&#xff1a;国J统计局 3、指标包括&#xff1a; 人均受教育年限、劳动生产率、6岁及6岁以上人口数(人口抽样调查)(人)、6岁及6岁以上初中人口数(人口抽样调查)(人)、 6岁及6岁以上大专及以上人口数(人…

机器学习分类方法

1、支持向量机 1.1支持向量机简介&#xff1a; 支持向量机&#xff08;support vector machines, SVM&#xff09;是一种二分类模型&#xff0c;它的基本模型是定义在特征空间上的间隔最大的线性分类器&#xff0c;间隔最大使它有别于感知机&#xff1b;SVM还包括核技巧&…

【教学类-18-02】20221124《蒙德里安“红黄蓝黑格子画”-A4竖版》(大班)

效果展示&#xff1a; 单页效果 多页效果 预设效果 背景需求&#xff1a; 2022年11月23日&#xff0c;作为艺术特色幼儿园&#xff0c;蒙德里安风格装饰在我们幼儿园的环境中。 蒙德里安是几何抽象画派的先驱&#xff0c;以几何图形为绘画的基本元素&#xff0c;与德士堡等创…

Python毕业设计选题推荐

同学们好&#xff0c;这里是海浪学长的毕设系列文章&#xff01; 对毕设有任何疑问都可以问学长哦! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越…

释放数据生产力,数据治理要“即时”

近年来&#xff0c;数据成为核心生产要素之后&#xff0c;人们总是期待充分释放数据生产力。但知易行难&#xff0c;如何释放数据生产力&#xff0c;大部分企业却莫衷一是、无所适从。 尤其是针对文档等非结构化数据&#xff0c;工程设计、生物医药、智能制造、金融、教育等行…

关于地方美食的HTML网页设计——地方美食介绍网站 HTML顺德美食介绍 html网页制作代码大全

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

SpringBoot 场景开发多面手成长手册

小册介绍 SpringBoot之强大 SpringBoot 的强大之处不言而喻&#xff0c;其底层 SpringFramework 强大的 IOC 容器和 AOP 机制&#xff0c;加之 SpringBoot 的自动装配&#xff0c;使得 SpringBoot 成为当今 JavaEE 开发中最受欢迎、使用范围极其广泛的基本技术。 但是&#x…

高性能队列Disruptor使用教程

目录一、简介二、代码2.1 依赖2.2 角色介绍2.3 事件类2.4 生产者2.5 消费者2.6 启动Disruptor2.7 测试源码一、简介 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列&#xff0c;研发的初衷是解决内存队列的延迟问题&#xff08;在性能测试中发现竟然与I/O操作处于同样的…

【C++】多态/虚表

目录 一、概念 二、虚表工作/运行原理 1.虚函数在一个类内存储的大小 2.对虚函数的访问&#xff08;一维数组&#xff09; 3.单继承 &#xff08;1&#xff09;虚函数继承情况 &#xff08;2&#xff09;单继承存储的大小 &#xff08;3&#xff09;基类子类调用情况 …

Actipro Windows Forms Controls 22.1.3 注册版

Actipro Windows Forms Controls 窗体控件 一组用于构建漂亮的 Windows 窗体桌面应用程序的 UI 控件 语法编辑器 语法高亮代码编辑器控件和解析套件。 为您自己的应用程序带来类似于 Visual Studio 的强大代码编辑体验&#xff0c;以及流行代码编辑器中的所有高级功能。大多数流…

二次封装 Spring Data JPA/MongoDB,打造更易用的数据访问层

本文正在参加「金石计划 . 瓜分6万现金大奖」 最近我在做一个新项目&#xff0c;由于我们项目组一直使用的是 MongoDB 数据库&#xff0c;所以新项目我就打算上 Spring Data MongoDB 尝试一下&#xff0c;虽然我早就用过了 Spring Data JPA&#xff0c;对 Spring Data 的相关 …