📄 tree-8-19.cpp
字号:
//头文件
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<bios.h>
#include<dos.h>
//有关平衡二叉树操作的头文件
#include"treefile.h"
//有关文本图形菜单的头文件
#include"menu.h"
//由随机数建立平衡二叉树
void creatrand(BSTree &T)
{
int i;
int tp=0,ti=1,r1,rn=2;
int b[32]={0},data[32]={0},bf[32]={0};
int a[32]={0};
for(r1=random(10);;r1=random(10))
if(r1>2&&r1!=rn)
{rn=r1;break;}
for(i=0;i<rn;i++)
for(r1=random(99);;r1=random(99))
if(r1!=0&&r1!=a[i])
{a[i]=r1;break;}
creattree(T,a[0]);
for(i=0;i<rn;i++){
InsertAVL(T,a[i],tp);
tp=0;
}
textbackground(BLUE);
window(3,3,54,23);
clrscr();
preorder(T,b,data,bf,ti);
printree(24,3,b,data,bf);
}
//向平衡树二叉树中添加结点
void addtreenode(BSTree &T)
{
int i,addnode;
int tp=0,ti=1;
int b[32]={0},data[32]={0},bf[32]={0};
textcolor(BLUE);
textbackground(GREEN);
window(56,15,79,23);
clrscr();
gotoxy(56,16);
printf("Enter adding node:");
gotoxy(74,16);
_setcursortype(_NORMALCURSOR);
scanf("%d",&addnode);
_setcursortype(_NOCURSOR);
InsertAVL(T,addnode,tp);
textbackground(BLUE);
window(3,3,54,23);
clrscr();
preorder(T,b,data,bf,ti);
printree(24,3,b,data,bf);
}
//从平衡树二叉树中删除结点
void deltreenode(BSTree &T)
{
BSTree q0=NULL;
int delnode,fag=0;
int tp=0,ti=1;
int b[32]={0},data[32]={0},bf[32]={0};
textcolor(BLUE);
textbackground(GREEN);
window(56,15,79,23);
clrscr();
gotoxy(56,19);
printf("Enter delet node:");
gotoxy(73,19);
_setcursortype(_NORMALCURSOR);
scanf("%d",&delnode);
_setcursortype(_NOCURSOR);
deletnode(T,delnode,q0,tp,fag);
textbackground(BLUE);
window(3,3,54,23);
clrscr();
preorder(T,b,data,bf,ti);
printree(24,3,b,data,bf);
}
//释放平衡树所占的存储空间
void destroytree(BSTree &T,BSTree &f)
{
if(T){
destroytree(T->lchild,T);
destroytree(T->rchild,T);
if(f){
if(f->lchild==T){
f->lchild=NULL;
free(T);}
if(f->rchild==T){
f->rchild=NULL;
free(T);}
}
else
{free(T);T=NULL;}
}
}
//由输入数据建立平衡二叉树
void creatinput(BSTree &T)
{
int i,tp=0,ti=1,nnode=0;
int b[32]={0},data[32]={0},bf[32]={0};
int a[32]={0};
textcolor(BLUE);
textbackground(YELLOW);
window(56,3,79,12);
clrscr();
_setcursortype(_NORMALCURSOR);
gotoxy(56,4);
cprintf("Enter node number:");
gotoxy(74,4);
scanf("%d",&nnode);
_setcursortype(_NOCURSOR);
if(nnode<1 || nnode>7)
return;
for(i=0;i<nnode;i++){
textcolor(BLUE);
textbackground(YELLOW);
window(56,3,79,12);
clrscr();
_setcursortype(_NORMALCURSOR);
gotoxy(56,4);
cprintf("Enter the node [%d]:",i+1);
gotoxy(76,4);
scanf("%d",&a[i]);
_setcursortype(_NOCURSOR);
if(a[i]>99)
return;
}
creattree(T,a[0]);
for(i=0;i<nnode;i++){
InsertAVL(T,a[i],tp);
tp=0;
}
textbackground(BLUE);
window(3,3,54,23);
clrscr();
preorder(T,b,data,bf,ti);
printree(24,3,b,data,bf);
}
//查找平衡二叉树中的结点
void searchnode(BSTree &T)
{
int i,searchnode;
int ti=1;
int b[32]={0},data[32]={0},bf[32]={0};
char buf[10000];
textcolor(BLUE);
textbackground(GREEN);
window(56,15,79,23);
clrscr();
gotoxy(56,16);
cprintf("Enter searching node:");
gotoxy(77,16);
_setcursortype(_NORMALCURSOR);
scanf("%d",&searchnode);
_setcursortype(_NOCURSOR);
textbackground(BLUE);
window(3,3,54,23);
clrscr();
preorder(T,b,data,bf,ti);
printree(24,3,b,data,bf);
gettext(3,3,54,23,buf);
printsearchtree(24,3,b,data,bf,searchnode);
getch();
puttext(3,3,54,23,buf);
}
//先序遍历树
void preordtree(BSTree &T,int a[32],int &i)
{
if(T){
a[i++]=T->data;
preordtree(T->lchild,a,i);
preordtree(T->rchild,a,i);
}
}
//输出平衡二叉树的结点数据
void printtreenode(BSTree &T)
{
int i=0;
int a[32]={0};
preordtree(T,a,i);
textcolor(BLUE);
textbackground(YELLOW);
window(56,3,79,12);
clrscr();
_setcursortype(_NORMALCURSOR);
gotoxy(56,4);
cprintf("The tree node:");
gotoxy(56,6);cprintf("{");
for(i=0;i<32 && a[i];i++)
if(i>=4){
gotoxy(57+(i-4)*3,7);
cprintf("%d,",a[i]);
}
else{
gotoxy(57+i*3,6);
cprintf("%d,",a[i]);
}
gotoxy(78,7);cprintf("}");
_setcursortype(_NOCURSOR);
}
//合并两棵平衡二叉树
/*void compoundtree(BSTree &T,BSTree &T1,BSTree &T2)
{
BSTree ty=NULL;
//int a[32]={0},c[32]={0};
int tp=0,ti=0,i=0;
int b[32]={0},data[32]={0},bf[32]={0};
//preordtree(T2,a,i);i=0;
//preordtree(T1,c,i);
int a[32]={12,52,98},c[32]={15,45,26,38};
creattree(T,a[0]);
for(i=0;i<32 && a[i];i++){
InsertAVL(T,a[i],tp);
tp=0;
}
for(i=0;i<32 && c[i];i++){
InsertAVL(T,c[i],tp);
tp=0;
}
textbackground(BLUE);
window(3,3,54,23);
clrscr();
preorder(T,b,data,bf,ti);
printree(24,3,b,data,bf);
//destroytree(T2,ty);ty=NULL;
//destroytree(T1,ty);
} */
//将一棵平衡二叉树分成两棵平衡二叉树
void departtree(BSTree T,BSTree &T1,BSTree &T2)
{
BSTree ty=NULL;
int mnode;
int i=0,tp=0,ti=0,a[32]={0},c[32]={0};
int b[32]={0},data[32]={0},bf[32]={0};
textcolor(BLUE);
textbackground(GREEN);
window(56,15,79,23);
clrscr();
gotoxy(56,16);
printf("Enter the mid node:");
gotoxy(75,16);scanf("%d",&mnode);
preordtree(T,a,i); i=0;
preordtree(T,c,i);
for(i=0;i<32;i++)
if(a[i]){
InsertAVL(T1,a[i],tp);
tp=0;
}
for(i=0;i<32;i++)
if(c[i]){
InsertAVL(T,c[i],tp);
tp=0;
}
destroytree(T2,ty);
textbackground(BLUE);
window(3,3,54,23);
clrscr();
preorder(T1,b,data,bf,ti);
printree(24,3,b,data,bf);
for(i=0;i<32;i++){
b[i]=0; ti=0;
data[i]=0; bf[i]=0;
}
textbackground(BLUE);
window(3,3,54,23);
clrscr();
preorder(T2,b,data,bf,ti);
printree(24,3,b,data,bf);
}
//帮助信息
void help(char *buff)
{
gettext(1,1,80,25,buff);
printhelp();
}
//关于信息
void about(char *buff)
{
gettext(1,1,80,25,buff);
printabout();
}
//主函数,控制菜单及相关操作
void main()
{
BSTree T=NULL,tp=NULL;
//BSTree T1=NULL,T2=NULL;
int b_Exit=0,flag=0;
int n_Menu=0,i,fag1=0,fag2=0;
char buff1[10000]={0},buff2[10000]={0};
textmode(C80);
printcover();
textbackground(BLACK);
textcolor(BROWN);
clrscr();
FrameDraw();
while(!b_Exit){
switch(bioskey(0)){
case F10_KEY: //激活菜单
if((n_Menu=MenuSelect())!=0)
switch(n_Menu){
case FILE_FRESH: //界面刷新
FrameDraw();
if(T) //释放树的存储空间
destroytree(T,tp);
break;
case NEWBUILD_RNDNUM: //随机数建立树
creatrand(T);
while(!flag)
switch(bioskey(0)){
case RETURN_KEY:
flag=1;
break;
case DOWN_KEY:
creatrand(T);
break;
}
printtreenode(T);
flag=0;
break;
case NEWBUILD_INPUTNUM: //输入数据建立树
creatinput(T);
printtreenode(T);
break;
case EDIT_SEARCH: //查找树的结点
if(T){
searchnode(T);
printtreenode(T);
}
break;
case EDIT_ADD: //向树中添加结点
if(T){
addtreenode(T);
printtreenode(T);
}
break;
case EDIT_DEL: //从树中删除结点
if(T){
deltreenode(T);
printtreenode(T);
}
break;
case BIOPT_RANDNUM: //随机建二棵树(用于合并树)
/*creatrand(T1);
while(!flag)
switch(bioskey(0)){
case RETURN_KEY:
printtreenode(T1);
creatrand(T2);
while(!flag)
switch(bioskey(0)){
case RETURN_KEY:
flag=1;
break;
case DOWN_KEY:
creatrand(T2);
break;
}
printtreenode(T2);
break;
case DOWN_KEY:
creatrand(T1);
break;
}
flag=0;*/
break;
case BIOPT_COMPOUND: //合并两棵树
/*if(T1 && T2){
compoundtree(T,T1,T2);
printtreenode(T);
}
T=T1=T2=NULL;*/
break;
case BIOPT_DEPART: //将一棵树折分为两棵树
/*if(T){
departtree(T,T1,T2);
printtreenode(T);
}
T1=T2=NULL;*/
break;
case HELP_HELP: //帮助信息
for(i=0;i<10000;i++)
buff1[i]=NULL;
help(buff1);
break;
case HELP_ABOUT: //关于信息
for(i=0;i<10000;i++)
buff2[i]=NULL;
about(buff2);
break;
case FILE_EXIT: //退出系统
b_Exit=1;
break;
}
break;
case RETURN_KEY: //由帮助、关于界面返回
for(i=0;i<10000;i++)
if(buff1[i])
{ fag1=1; break;}
if(fag1) puttext(1,1,80,25,buff1);
for(i=0;i<10000;i++)
if(buff2[i])
{ fag2=1; break;}
if(fag2) puttext(1,1,80,25,buff2);
fag1=fag2=0;
for(i=0;i<10000;i++)
{buff1[i]=NULL;buff2[i]=NULL;}
break;
case UP_KEY: //在进入或刷新界面后,
case DOWN_KEY: //不响应光标键
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -