本人用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(