树的基本操作(数据结构)

news2024/11/18 17:50:05

树的创建

//结构结点 
typedef struct Node
{
	int data;
	struct Node *leftchild;
	struct Node *rightchild;
}*Bitree,BitNode;

//初始化树 
void Create(Bitree &T)
{
	int d;
	printf("输入结点(按0为空结点):");
	scanf("%d",&d);
	if(d!=0)
	{
		T = (Bitree)malloc(sizeof(BitNode));
		T->data=d;
		Create(T->leftchild);
		Create(T->rightchild);
	}
	else{
		T=NULL;
		return;
	}
}

遍历树(递归)

//先序遍历 
void PreOrder(Bitree &T)
{
	Bitree D;
	D=T;
	if (D)
	{
		printf("%d", D->data);
		PreOrder(D->leftchild);
		PreOrder(D->rightchild);
	}
}

//中序遍历
void InOrder(Bitree &T)
{
	Bitree D;
	D=T;
	if (T)
	{
		InOrder(D->leftchild);
		printf("%d", D->data);
		InOrder(D->rightchild);
	}
 }
 
//后序遍历
void PostOrder(Bitree &T)
{
	Bitree D;
	D=T;	
	if (T)
	{
		PostOrder(D->leftchild);
		PostOrder(D->rightchild);
		printf("%d", D->data);
	}
}

非递归遍历

#define MaxSize 100
typedef struct{
	BitNode *data[MaxSize];
	int top;
}SqStack;

//初始化栈
void InitStack(SqStack &S){
	S.top = -1;
} 

//判断栈空
bool StackEmpty(SqStack S){
	if(S.top==-1) return true;//空栈
	else return false; 
} 

//进栈
void Push(SqStack &S, BitNode *x){
	if(S.top==MaxSize-1) return;//满栈
	S.top = S.top+1;//指针加1
	S.data[S.top]=x;//新元素入栈  
} 

//出栈
BitNode* Pop(SqStack &S){
	if(S.top==-1) return NULL;//空栈
	BitNode *x;
	x= S.data[S.top];
	S.top = S.top-1; 
	return x;
} 
//非递归遍历
void InOrder2(Bitree &T){
	SqStack S;
	InitStack(S);//初始化栈 
	Bitree P=T;//p是遍历指针 
	while(P||!StackEmpty(S)){
		if(P){//一路向左 
			Push(S,P);//当前结点入栈 
			P=P->leftchild;//左孩子不为空,一直向左走 
		} 
		else{
			P=Pop(S);//出栈,并转向右子树 
			printf("%d",P->data);//输出出栈元素 
			P=P->rightchild;//向右子树走 
		}
	}
}

void PreOrder2(Bitree &T){
	SqStack S;
	InitStack(S);//初始化栈 
	Bitree P=T;//p是遍历指针 
	while(P||!StackEmpty(S)){
		if(P){//一路向左 
			printf("%d",P->data);
			Push(S,P);//当前结点入栈 
			P=P->leftchild;//左孩子不为空,一直向左走 
		} 
		else{
			P=Pop(S);
			P=P->rightchild; 
		}
	}
}

层次遍历

#define MaxSize 100
typedef struct{
	int front,rear;
	BitNode *data[MaxSize];
}SqQueue;

//初始化队列
void InitQueue(SqQueue &Q){
	Q.front=Q.rear=0;
} 

//判断队列是否为空
bool QueueEmpty(SqQueue Q){
	if(Q.front==Q.rear) return true;//空队列
	else return false; 
}

//入队
bool EnQueue(SqQueue &Q,BitNode *x){
	if((Q.rear+1)%MaxSize==Q.front){//判断队满
		return false; 
	}
	Q.data[Q.rear]=x;//新元素入队 
	Q.rear = (Q.rear+1)%MaxSize;//队尾指针加一取模 让队列循环使用 
	return true;
} 

//出队
BitNode* DeQueue(SqQueue &Q){
	if(Q.front==Q.rear) return NULL;//队列为空 
	BitNode *x;
	x = Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize;//对头指针后移 
	return x;
} 

//层次遍历
void LevelOrder(Bitree &T){
	SqQueue Q;
	InitQueue(Q);
	Bitree P;
	EnQueue(Q,T);
	while(!QueueEmpty(Q)){
		P=DeQueue(Q);
		printf("%d ",P->data);
		if(P->leftchild!=NULL)
			EnQueue(Q,P->leftchild);
		if(P->rightchild!=NULL)
			EnQueue(Q,P->rightchild);
	}
} 

主函数

int main(){
	Bitree T;
	Create(T);
	printf("前序遍历:");
	PreOrder(T);
	printf("\n");
	printf("中序遍历:");
	InOrder(T);
	printf("\n");
	printf("后序遍历:");
	PostOrder(T);
	printf("\n");
	
	printf("中序遍历(非):");
	InOrder2(T);
	printf("\n");
	printf("前序遍历(非):"); 
	PreOrder2(T);
	printf("\n");
	
	printf("层次遍历:");
	LevelOrder(T);
	return 0;
} 

在这里插入图片描述

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

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

相关文章

Python学习笔记——存储容器

食用说明:本笔记适用于有一定编程基础的伙伴们。希望有助于各位! 列表 列表类似数组,其中可以包含不同类型的元素,写法如下: list1 [Google, Runoob, 1997, 2000] list2 [1, 2, 3, 4, 5 ] list3 ["a", …

Speech | .flac文件转换为.wav文件,并进行重采样(Python脚本)

把flac结尾的,替换为wav文件,然后对wav文件进行重采样(48000->22050),可以更换采样率,运行后保存为新的地址,所有文件都在同一文件夹下(保证能运行)。 # 把flac结尾的…

java中使用sqlserver调用MySQL数据库的表进行操作

项目场景: 部分需求需要对不同的数据库进行操作,我这里是一个小程序里调用了另一个数据 解决方案: 目前我个人使用了两个方案解决的,看自己觉得哪个方便 方案一: 使用JDBC 新建一个实体类,相当于mapper.xml了,然后在这个实体类里进行数据库的连接操作…

2023年中国气体压缩机市场规模及产量分析[图]

气体压缩机是把机械能转换为气体压力能的一种动力装置,常用于风动工具提供气体动力,在石油化工、钻采、冶金等行业也常用于压送氧、氢、氨、天然气、焦炉煤气、惰性气体等介质。常见的气体压缩机包括离心式压缩机、螺杆式压缩机、往复式压缩机等。 气体…

VUE:可收缩工具栏

作者:CSDN @ _乐多_ 本文记录了一个vue可伸缩工具栏组件,代码即插即用。 只需要新增函数名并且填函数体就可以。 效果如下图所示, 文章目录 一、Vue代码一、Vue代码 <template><div class="ToolBar"><div class=

全球范围内先进封装设备划片机市场将迎来新的发展机遇

随着半导体工艺的不断发展&#xff0c;先进封装技术正在迅速发展&#xff0c;封装设备市场也将迎来新的发展机遇。作为先进封装设备中的关键设备之一&#xff0c;划片机的发展也备受关注。 划片机是用于切割晶圆或芯片的设备&#xff0c;其精度和稳定性直接影响到封装产品的质量…

Vue_组件详解

Vue_组件详解 初识组件组件组成组件的根节点父子组件 组件注册全局注册局部注册 组件间数据传递Props&#xff08;父 ----> 子&#xff09;props声明注意问题 组件间数据传递emit&#xff08;子 ----> 父&#xff09; 初识组件 组件&#xff08;Component&#xff09;&a…

WordPress导航主题蘑菇导航源码

蘑菇导航的列表页有两种风格&#xff0c;分别对应宽屏、窄屏。可以点击 文章。博客查看演示。文章页也是如此&#xff0c;这两种风格可以在后台设置。 本站菜单中的 VIP解析、音乐、图床&#xff0c;是单独的源码&#xff0c;不包含在本次主题中。后期看大家的要求&#xff0c…

Python中的循环语句Cycle学习

二、循环语句 1、什么是循环语句 一般编程语言都有循环语句,为什么呢? 那就问一下自己,我们弄程序是为了干什么? 那肯定是为了方便我们工作,优化我们的工作效率啊。 而计算机和人类不同,计算机不怕苦也不怕累,也不需要休息,可以一直做。 你要知道,计算机最擅长就…

【Java】栈和队列的模拟实现(包括循环队列)

异常为空栈异常&#xff1a; public class EmptyStackException extends RuntimeException {public EmptyStackException(){}public EmptyStackException(String msg){super(msg);}}循环队列&#xff1a; class MyCircularQueue {public int[] elem;public int front;//队…

绿色低碳,数字为先:万应低代码推动能源资产管理优化

10月7日&#xff0c;湘江新区经济发展局发布关于印发《湖南湘江新区推进碳达峰碳中和三年行动工作方案及责任分工&#xff08;2023-2025&#xff09;》的通知&#xff0c;把碳达峰碳中和工作纳入湖南湘江新区经济社会发展和生态文明建设整体布局。 随着科学技术的不断发展&…

10月第2周榜单丨飞瓜数据B站UP主排行榜榜单(B站平台)发布!

飞瓜轻数发布2023年10月9日-10月15日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营…

线程池线程保活以及动态更新线程数

基本知识 各位大佬在面试过程肯定会被问到线程池或者多线程的问题&#xff0c;例如&#xff1a; 线程池核心参数及其作用线程池添加任务的执行顺序任务队列以及任务的拒绝策略等等 这些问题是相信稍微研究过线程池JDK源码的都能掌握。有兴趣的可以参数这篇博文。 在进入今天…

去除照片中多余人物方法分享-这些方法快收藏起来

拍照时经常会碰到一些意外的情况&#xff0c;比如不小心捕捉到了一些不需要的人或物&#xff0c;这会影响照片的美观效果&#xff0c;因此学习如何去除照片中多余人物就显得特别重&#xff0c;下面分享一些常用的去除照片中多余人物的方法&#xff0c;如果你也感兴趣的话&#…

使用按钮从 SAP 系统内打开 Excel 文件

了解如何通过 SAP 屏幕上创建的按钮打开所需的 Excel 文件。为了演示这一点&#xff0c;将指导您完成以下步骤。 使用 del 命令删除 SAP 上不必要的元素添加一个按钮&#xff0c;单击后打开弹出窗口创建一个函数来选择 excel 文件创建打开所需 excel 文件的函数 定制 登录 S…

Linux下程序(C语言)实现对文件的复制

目标&#xff1a; 使用系统调用实现cp命令。 原理&#xff1a; 使用系统调用fopen打开文件&#xff0c;使用fgets()从文件读数据&#xff0c;使用fputs() 向文件写数据。 linux 文件 创建命令为 vi (文件名&#xff09;.c 文件源码&#xff1a; #include<stdio.h>…

linux安装达梦数据库(命令行安装)

安装达梦数据库 创建安装用户 1,创建安装用户组dinstall [rootdmDMServer1 ~]# groupadd -g 12345 dinstallgroupadd : 创建组 -g : 指定组id&#xff08;GID&#xff09; 12345&#xff1a; 指定的组名称 dinstall &#xff1a; 组名 2,创建安装用户dmdba [rootdmDMSe…

如何使用 Python 在终端中创建令人惊叹的图形

说明 在当今数据驱动的世界中&#xff0c;可视化或图形确实表达了一个胜过千言万语的故事。可视化提供了快速有效的通信媒体来传达数据&#xff0c;如果与文本或表格共享&#xff0c;则可能难以理解。 虽然有许多强大的可视化工具可用&#xff0c;但有时我们需要一种快速简便的…

SpringBoot的多环境切换(已废除)

profile是Spring对不同环境提供不同配置功能的支持&#xff0c;可以通过激活不同的环境版本&#xff0c;实现快速切换环境 application-dev.yaml server:port: 8082 application-test.yaml server:port: 8081 我们在主配置文件编写的时候&#xff0c;文件名可以是 applicat…

58 乘积最大子数组

乘积最大子数组 题解1 DP换成三个变量&#xff08;因为是连续的&#xff0c;只和上一个状态有关的&#xff0c;所以三个暂存变量迭代就行&#xff09; 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的 非空连续子数组&#xff08;该子数组中至少包含一个数字&am…