⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tree-8-19.cpp

📁 数据结构 Balance-Bi-Tree 数据结构 Balance-Bi-Tree 数据结构 Balance-Bi-Tr
💻 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 + -