C语言设计二叉树基本运算系统

本文介绍了一个使用C语言编写的二叉树基本运算系统,该系统结合EasyX库提供直观的DOS界面,支持先根、中根、后根、层次遍历等13种操作。包括节点计数、高度计算、路径查找、节点删除、树的复制与镜像等功能。程序运行需注意英文输入,并在Visual Studio 2017环境下编译。
摘要由CSDN通过智能技术生成

本人用C语言写了一个关于二叉树的基本运算系统这个系统使用了EasyX库中的函数来绘制了一个比较直观的dos界面,比传统dos界面更能接受一些,这个系统的基本操作有:
(1)先根遍历
(2)中根遍历
(3)后根遍历
(4)层次遍历
(5)求二叉树的内部结点数
(6)求二叉树的叶子树
(7)求二叉树的高度
(8)求根到叶子结点的所有路径
(9)删除二叉树的某个结点
(10)复制二叉树
(11)求二叉树的镜像(将二叉树旋转180°)
(12)修改二叉树的某个结点的数据
(13)求二叉树的结点数
使用程序说明:
1、程序刚使用会进行初始化,也就是录入一颗二叉树,‘#’代表空结点,并只能录入英文状态下的所有字符(字母、英文符号、数字)!!!中文录入会出错!
2、程序分三个区域:功能区、功能操作显示区、用户操作显示区;
3、在使用软件时,请按照功能区上的数字对应进行输入操作,并且使用全过程必须在英文状态下进行操作!
个人认为这个系统有助于学习二叉树基础,所以在这里分享给大家参考!若有错误的地方欢迎大家留言帮助修改!
具体代码如下:
mian.cpp页面(主要是绘制一个比较好看直观的dos界面,然后调用程序的主函数):

// 二叉树基本运算系统.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <time.h>  //时间相关头文件
#include <conio.h> //按键相关头文件
#include "BItree.h"		//二叉树基础功能头文件

#define Maxsize 50

//坐标
struct Coord{
   		
	int x;
	int y;
};

//功能区
struct Function {
   				
	Coord frc;					//功能区坐标
	char funch;					//功能区键值
}fun;
struct Show {
   					//显示区
	Coord src;					//显示区坐标
}show;

//初始化
void initView() {
   
	
	initgraph(640, 480);		//初始化图形环境
	fun.frc.x = 10;				//初始化功能区坐标位置
	fun.frc.y = 20;
	show.src.x = 10;			//初始化显示区坐标位置
	show.src.y = 235;
}
//绘制视图框架
void ViewPaint() {
   				
	//绘制标题
	settextcolor(LIGHTGREEN);
	settextstyle(15, 0, L"黑体");
	outtextxy(200, 2, L"二叉树基础功能运算系统");

	//绘制功能区
	setlinecolor(GREEN);
	rectangle(fun.frc.x, fun.frc.y, fun.frc.x + 620, fun.frc.y + 210);	//绘制矩形功能区;
	
	//绘制显示区
	rectangle(show.src.x, show.src.y, show.src.x + 620, show.src.y + 235);	//绘制矩形显示区

	//绘制回显区域
	rectangle(450, 245, 620, 460);											//绘制矩形用户输入回显区域
}

//绘制功能区内容
void FunPaint() {
   
	settextcolor(LIGHTGREEN);
	settextstyle(15, 0, L"行楷");
	outtextxy(30, 30, L"1.先根遍历");
	outtextxy(340, 30, L"2.中根遍历");
	outtextxy(30, 55, L"3.后根遍历");
	outtextxy(340, 55, L"4.层次遍历");
	outtextxy(30, 80, L"5.求二叉树的内部节点数");
	outtextxy(340, 80, L"6.求二叉树的叶子树");
	outtextxy(30, 105, L"7.求二叉树的高度");
	outtextxy(340, 105, L"8.求根到叶子结点的所有路径");
	outtextxy(30, 130, L"9.删除二叉树的某个结点");
	outtextxy(340, 130, L"10.复制二叉树");
	outtextxy(30, 155, L"11.求二叉树的镜像");
	outtextxy(340, 155, L"12.修改二叉树的某个结点的数据");
	outtextxy(30, 180, L"13.统计结点数");
	outtextxy(340, 180, L"0.退出系统");
	line(20, 200, 620, 200);
	outtextxy(30, 205, L"|请根据功能区选项并且在英文输入状态下进行操作!||输入结束按Enter确认操作|");
}
//结束语
void Over()
{
   
	cleardevice();			//清屏
	settextcolor(LIGHTGREEN);
	settextstyle(30, 0, L"黑体");
	outtextxy(260, 160, L"感谢使用!");
	outtextxy(130, 210, L"班级:2017级计算机科学与技术");
	outtextxy(130, 260, L"团队:罗柱、杨福勇、陈海媚");
	Sleep(2500);
	closegraph();			//关闭绘制
	exit(0);
}
//获取用户输入数据并绘制到显示区
void GetShow(int &Char_x,int &Char_y, char Key_char) {
   
	
	if ((247 + Char_y) >= 432) {
   					//y超过显示框,清空显示框,重新开始,按照输出最大11行计算,一行高度是17
		Char_y = 20;
		Char_x = 0;
		clearrectangle(451, 246, 619, 469);		//清空用户输入显示区
	}
	if ((62 + 455 + Char_x) >= 610) {
   			//x超过显示框,换行显示
		Char_y += 17;
		Char_x = 62;							//从字符后输出
	}
	if (Key_char == 13) {
   		//如果输入键值为13:Enter;则表示输入结束,显示到下一行
		Char_y += 17;
		Char_x = 0;
	}
	outtextxy(455, 250 + Char_y, L"->>输入:");
	outtextxy(62 + 455+ Char_x, 250 + Char_y, Key_char);//显示用户输入的字符到显示框内
	if(Key_char != 13)
		Char_x += 8;
	
	if (((Key_char < 48) || (Key_char > 57))&& (Key_char != 13)) {
   
		settextcolor(RED);
		outtextxy(455, 445, L"->>请输入功能区数字");//输入指令错误提醒
		Sleep(1500);
		clearrectangle(451, 445, 619, 459);			//清空用户输入显示区
	}
	
}
//显示超行清屏重显,当每一次输入时检测
void clear_Show(int &out_view_y) {
   
	if ((out_view_y >= 204)) {
   					//控制显示区显示数量
		clearrectangle(11, 265, 449, 469);		//清空步骤显示区
		out_view_y = 0;
	}
}
//显示超行清屏重显,当每一次有输出时检测
void clear_Show_out(int &out_view_y) {
   
	if ((out_view_y >= 204)) {
   					//控制显示区显示数量
		Sleep(1000);
		clear_Show(out_view_y);								//显示超出显示区,先清屏再执行
	}
}

int main()
{
   
	BTree tree, ctree, mtree;		//二叉树,复制二叉树,镜像二叉树
	int innode_num = 0, leaf_num = 0, lount_num = 0, in_Swi=-1;
	int high_i = 0, high_j = 0,inStr = 0, address_num = 0;	//二叉树高度返回值
	int entry_num = 0;				//系统第一次使用
	int GShow_y = 20;				//定义输出位置自增变量(行间距:10 + 字符高度15)
	int GShow_x = 0;				//赋值一个字符的宽度,以进行字符的累计显示
	int out_view_x = 0;				//步骤显示字符的宽度变量
	int out_view_y = 0;				//步骤显示字符的行间距
	//根到叶子的路径变量,删除结点变量,修改二叉树数据的原数据,修改二叉树数据的新数据
	char address_path[10];			//根到叶子的路径
	char GetKey;					//获取一个字符
	char input_str[10];				//输入的字符串
	initView();						//初始化窗口
	while (1) {
   
		while (!_kbhit()) {
   			//当键盘没有按下执行循环
			ViewPaint();			//绘制视图框架
			FunPaint();				//绘制功能区
			if (entry_num == 0) {
   
				tree.create();		//初始化二叉树
				Sleep(1500);
				clearrectangle(10, 265, 630, 480);	//清空矩形区域,清空显示区
				entry_num = 1;		//初始化完成之后不在执行初始化语句
			}
			outtextxy(455, 247, L"-> 请输入执行操作");
		}
		GetKey = _getch(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值