2月4号作业

news2024/11/22 16:32:47

 编写程序实现二叉树的创建,三种遍历自己销毁

#include <myhead.h>

#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define OK 1
#define ERROR 0

#define INIT_SIZE 20
#define INCREMENT_SIZE 5

typedef int Status;
typedef int TElemType;
//存储结构

typedef struct BiNode{
	TElemType data;
	struct BiNode *lchild, *rchild;
}BiNode, *BiTree;

typedef enum {Travel = 1,Visit = 0}TaskType;

typedef struct{
	BiTree ptr;
	TaskType task;
}SElemType;

typedef struct{
	SElemType *top;
	SElemType *base;
	int size;
}Stack;//栈的数据结构
//初始化栈
Status InitStack(Stack *S)
{
	S->base = (SElemType *)malloc(sizeof(SElemType)*INIT_SIZE);
	if(!S->base)exit(OVERFLOW);
	S->top = S->base;
	S->size = INIT_SIZE;
	return OK;
}

 //判断是否为空
Status IsEmpty(Stack S)
  {
  	if(S.base==S.top)return TRUE;
  	return FALSE;
   }
//进入栈
 Status Push(Stack *S,SElemType e)//*S->top++=e
 {
 	if((S->top - S->base) / sizeof(SElemType)>=S->size)
 	{
 		S->base = (SElemType*)realloc(S->base,(S->size+INCREMENT_SIZE)*sizeof(SElemType));
 		if(!S->base)exit(OVERFLOW);
 		S->top = S->base + S->size;//从新申请了内存地址发生了变化
 		S->size += INCREMENT_SIZE;
	 }
	 *S->top = e;//先取*s->top 在++//*++S->top先加再取值;
	 S->top++;
	 return OK;
  }

  //pop
Status Pop(Stack *S, SElemType *e)
{
	if(S->top == S->base)return ERROR;
	*e = *--S->top;
	return OK;
 }

//创建二叉树(输入0结束)
Status CreateBiTree(BiTree *T)
{
	TElemType s;
	scanf("%d",&s);
	if(s==0)
		*T=NULL;
	else{

		*T = (BiTree)malloc(sizeof(BiNode));
		if(!T)
		{
			return OVERFLOW;
		}
		(*T)->data = s;
		CreateBiTree(&(*T)->lchild);//修改指针的值使其指向创建的值
		CreateBiTree(&(*T)->rchild);
		}
		return OK;
}
//访问元素
void visit(TElemType e)
{
	printf("%d ",e);
 }
//先序遍历递归实现
Status PreOrderTraverse(BiTree T,void(*visit)(TElemType e))
{
	if(T)
	{
		(*visit)(T->data);
		PreOrderTraverse(T->lchild,visit) ;
		PreOrderTraverse(T->rchild,visit);
	}
 }
 //中序遍历

 Status InOrderTraverse(BiTree T,void(*visit)(TElemType e))
{
	if(T)
	{
		InOrderTraverse(T->lchild,visit);
		(*visit)(T->data);
		InOrderTraverse(T->rchild,visit);
	}
 }
 // houxu

 Status PostOrderTraverse(BiTree T,void(*visit)(TElemType e))
{
	if(T)
	{
		PostOrderTraverse(T->lchild,visit);
		PostOrderTraverse(T->rchild,visit);
		(*visit)(T->data);
	}
 }

//前序遍历非递归
Status  PreOrder(BiTree T,void(*visit)(TElemType e))
{
	Stack S;
	InitStack(&S);
	BiTree p;
	SElemType e;
	e.ptr = T;
	e.task = Travel;
	if(T)
		Push(&S,e);
	while(!IsEmpty(S))
	{
		Pop(&S,&e);
		if(e.task == Visit)
			visit(e.ptr->data);
		else
		{
			if(e.ptr)
			{
		    	p = e.ptr;
				e.ptr = p->rchild;
				e.task = Travel;
				Push(&S,e);
				e.ptr = p->lchild;
				e.task = Travel;
				Push(&S,e);
				e.ptr = p;
				e.task = Visit;
				Push(&S,e);
			}

		}

	}


}
//中序遍历非递归
Status  InOrder(BiTree T,void(*visit)(TElemType e))
{
	Stack S;
	InitStack(&S);
	BiTree p;
	SElemType e;
	e.ptr = T;
	e.task = Travel;
	if(T)
		Push(&S,e);
	while(!IsEmpty(S))
	{
		Pop(&S,&e);
		if(e.task == Visit)
			visit(e.ptr->data);
		else
		{
			if(e.ptr)
			{
				p = e.ptr;
				e.ptr = p->rchild;
				Push(&S,e);
				e.ptr = p;
				e.task = Visit;
				Push(&S,e);
				e.ptr = p->lchild;
				e.task = Travel;
				Push(&S,e);
			}
		}
	}


}

//houxu非递归
Status  PostOrder(BiTree T,void(*visit)(TElemType e))
{
	Stack S;
	InitStack(&S);
	BiTree p;
	SElemType e;
	e.ptr = T;
	e.task = Travel;
	if(T)
		Push(&S,e);
	while(!IsEmpty(S))
	{
		Pop(&S,&e);
		if(e.task == Visit)
			visit(e.ptr->data);
		else
		{
			if(e.ptr)
			{
				e.task = Visit;
				Push(&S,e);
				p = e.ptr;
				e.ptr = p->rchild;
				e.task = Travel;
				Push(&S,e);
				e.ptr = p->lchild;
				e.task = Travel;
				Push(&S,e);
			}
		}
	}


}

 int main()
{
    BiTree T;
    printf("创建树,输入0为空树:\n");
    CreateBiTree(&T);
    printf("先序遍历递归:");
    PreOrderTraverse(T, *visit);
    printf("\n中序遍历递归:");
    InOrderTraverse(T, *visit);
    printf("\n后序遍历递归:");
    PostOrderTraverse(T, *visit);
    printf("\n");

    printf("\n前序非递归算法: ");
    PreOrder( T,*visit);
    printf("\n中序非递归算法: ");
    InOrder( T,*visit);
    printf("\n后序非递归算法: ");
    PostOrder( T,*visit);


    return 0;
}

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

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

相关文章

Linux权限【超详细】

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 扩展知识&#xff1a…

Linux项目自动化构建工具之make/Makefile演示gcc编译

文章目录 一、背景二、如何使用&#xff1f;三、原理四、关于make的问题五、再次理解/编写makefile依赖关系依赖方法 六、原理讲解项目清理makefile是支持变量的取消执行make后显示命令依赖方法可以多行 一、背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备…

C语言进阶之文件操作

一、什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09;。 1&#xff09;程序文件 包括源程序文件&#xff08;后缀为.c&#xff09;,目标文件&#xff…

VueFire:一个一流的 Vue 和 Firebase 体验,包括对 Nuxt 的支持,现在已经稳定了

VueFire&#xff0c;一个一流的 Vue 和 Firebase 体验 — 包括对 Nuxt 的支持&#xff0c;现在已经稳定了。 Vue 和 Firebase 现在比以往任何时候都更好了。 构建更好的VueFire 去年&#xff0c;我们宣布与 Eduardo San Martin Morote 合作&#xff0c;构建一个成熟的 Vue 和…

《数字乡村标准化白皮书(2024)》正式发布 智汇云舟参编

近日&#xff0c;全国信标委数字乡村标准研究组2023年度全体会议在北京召开。会议期间&#xff0c;智汇云舟参编的《数字乡村标准化白皮书&#xff08;2024&#xff09;》&#xff08;简称《白皮书》&#xff09;正式发布&#xff01; 发布仪式 白皮书研究背景 作为国家基础制…

交换机ARP学习异常,看网工大佬是如何处理的?

晚上好&#xff0c;我的网工朋友。 在复杂多变的网络环境中&#xff0c;网工就没有不遇到问题的&#xff0c;习惯了&#xff0c;兵来将挡水来土掩。 那ARP异常你遇到过吗&#xff1f;ARP作为网络中的基础协议之一&#xff0c;它的稳定性对整个网络的性能和可靠性至关重要。 …

【MongoDB】跨库跨表查询(python版)

MongoDB跨表跨库查询 1.数据准备&#xff1a;2.跨集合查询3.跨库查询应该怎么做&#xff1f; 讲一个简单的例子&#xff0c;python连接mongodb做跨表跨库查询的正确姿势 1.数据准备&#xff1a; use order_db; db.createCollection("orders"); db.orders.insertMan…

电路分析2

7 等效电路的思想&#xff0c;简化不是目的&#xff0c;这个电路说明一切&#xff01;_哔哩哔哩_bilibili 高中知识&#xff0c;翻笔记 8 什么时候用Y型&#xff1f;看到有有相同数字的时候&#xff0c;就可以考虑用 9 10 输入电阻还有没学完的 ok 11

海外多语言盲盒开发:打破语言障碍,连接全球消费者

随着全球化的加速和互联网的普及&#xff0c;语言障碍成为了影响跨国交流和商业活动的重要因素。为了满足跨国市场的需求&#xff0c;海外多语言盲盒开发成为了一个新兴的领域。本文将探讨海外多语言盲盒开发的意义、现状和未来发展。 一、海外多语言盲盒开发的意义 在全球化…

【C++】运算符重载详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读 1. 为什么需要运算符重载 2. 运算符重载概念 3. 运算符重载示例 3.1 运算符重载 3.2 >或<运算符 4. 运算符重…

提前祝大家新年好!来看看社区 2023 都得了哪些奖吧

大噶好&#xff01;转眼马上就是“龙”历新年啦&#xff0c;不知道大家这周的工作热情怎么样呢&#xff1f;小陈的心已经在殷切期盼回家过年了&#xff5e; RTE 开发者社区预祝诸位&#xff1a; 2024 年 &#x1f432;龙年添财气&#xff0c;万事皆胜意&#xff01; 回顾过去…

c语言封装继承详解

模块化编程结构 函数头文件 c语言头文件代码 #ifndef __Object_H_ #define __Object_H_// 继承 struct person {int id;char name[20];int gender;const char* (*getGender)(struct person* s);void (*setGender)(struct person* s, const char* strGender); }; struct teache…

C语言问题汇总

指针 #include <stdio.h>int main(void){int a[4] {1,2,3,4};int *p &a1;int *p1 a1;printf("%#x,%#x",p[-1],*p1);} 以上代码中存在错误。 int *p &a1; 错误1&#xff1a;取a数组的地址&#xff0c;然后1&#xff0c;即指针跳过int [4]大小的字节…

Flink1.14新版KafkaSource和KafkaSink实践使用(自定义反序列化器、Topic选择器、序列化器、分区器)

前言 在官方文档的描述中&#xff0c;API FlinkKafkaConsumer和FlinkKafkaProducer将在后续版本陆续弃用、移除&#xff0c;所以在未来生产中有版本升级的情况下&#xff0c;新API KafkaSource和KafkaSink还是有必要学会使用的。下面介绍下基于新API的一些自定义类以及主程序的…

【JavaEE进阶】 图书管理系统开发日记——伍

文章目录 &#x1f38b;前言&#x1f332;需求分析&#x1f384;约定前后端交互接口&#x1f333;实现服务器代码&#x1f6a9;控制层&#x1f6a9;业务层&#x1f6a9;数据层 &#x1f343;修改前端代码⭕总结 &#x1f38b;前言 这次我们来实现图书管理系统的增加图书模块。…

QT 应用中集成 Sentry

QT 应用中集成 Sentry QT应用中集成 SentrySentry SDK for C/C注册 Sentry 账号QT 应用中集成 Sentry触发 Crash 上报 QT应用中集成 Sentry Sentry 是一个开源的错误监控和日志记录平台&#xff0c;旨在帮助开发团队实时捕获、跟踪和解决软件应用程序中的错误和异常。它提供了…

qml中布局属性讲解

1.行布局&列布局:RowLayout&ColumnLayout RowLayout {id: layoutanchors.fill: parentspacing: 6Rectangle {color: tealLayout.fillWidth: trueLayout.minimumWidth: 50Layout.preferredWidth: 100Layout.maximumWidth: 300Layout.minimumHeight: 150Text {anchors.c…

基于nginx的虚拟主机配置

目录 一.基于不同ip的虚拟主机 二.基于不同端口的虚拟主机 三.基于不同域名的虚拟主机 一.基于不同ip的虚拟主机 1.关闭 SELinux和防火墙 2.在/data目录中创建三个目录&#xff0c;分别为nginx1、nginx2 和nginx3,具体名为: 3.分别在三个目录中创建index.html,并输入内容“…

C++程序在开机自启和定时器执行时遇到的问题和解决方法

遇到的错误如下&#xff1a; Camera is created.load vfvlog.[dll/so] failed for dll[/vfvlog.so] unexistedLoadDbgConfig, LoadFile fail, err:-3, errno: No such file or directoryqt.qpa.xcb: could not connect to displayqt.qpa.plugin: Could not load the Qt platfo…

XSS haozi靶场通关笔记

XSS靶场地址&#xff1a;alert(1) 靶场的要求是输出一个内容为1的弹窗&#xff1b;这个靶场限制了输入位置只能是input code&#xff1b;而且浏览器发送内容时会自动进行url编码&#xff1b;所以重点考察的是代码的分析和基础payload构造&#xff1b;一切完成在当前页面&#…