P3/P5 功能:二叉树操作 结构实习作业

本文介绍了一种二叉树操作的实习作业实现方法,包括树的初始化、遍历、节点交换、查找、删除等功能,并提供了丰富的示例代码,有助于读者理解和掌握二叉树的基本操作。

 有关树的操作的实习作业

为啥我标题写错了。。。现在才发现。。。。


大部分要求的功能呢,老娘都写出来了来着 哈夫曼树那种特别难写分又少的我就没有写 ~_~

但是由于种种不可抗力的原因我的删除功能是假的 会用0把那个数字换掉

因为我搜索函数是独立出来的  指针是用函数互相传的 然后就有一个结果,我不能动我的原☞针 ,只能动它指向的数据...

据说传递一个*&就可以了但是我没有学会 或者找指针的工作不用外面的函数,delete里面自己写就可以的,各位大神自己写吧

 


 界面

 coffee是一个小彩蛋 ( ̄︶ ̄)↗ 

w : 输出一个 map.txt --like this:

q: 输出一个 test.txt --like this:


源码:

/*
	源文件名:P5.cpp
	功能:二叉树操作
*/
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stack>
#include <queue>
using namespace std;
 struct BiTNode        //二叉树结点类型
{
	int data;         //数据
		int tem1,tem2;    //辅助数据(实习题不用)
	BiTNode *left=NULL;    //左子树指针
	BiTNode *right=NULL;   //右子树指针
};
//放置全局变量的位置
#define max 100
int leaves = 0;
BiTNode MYTREE;
BiTNode *Tree;      //本程序操作的二叉树根指针
int elem[max];        //存放原始数据
//放置函数声明的位置
void wait(){
	cout << "\n请按任意键继续\n" << flush;
	getch();
}
void generate(BiTNode *Tree);
void show_in_order(BiTNode *T);
void leaf(BiTNode *T);
void deep(BiTNode * root);
void Exchange(BiTNode *bt);
void CreateTree(BiTNode *T);
void sbtree(BiTNode*Tree);
void coffee();
BiTNode *init1();
void showBinTree(BiTNode *Tree);
void findintree(BiTNode *T);
void del_it(BiTNode *T);
void preOrder2(BiTNode *root);
void leveOrder(BiTNode *root);
void printTree(BiTNode *t,int space);
void GuangYi(BiTNode *T);
void write_in_3_order(BiTNode *T);
int main()
{
	Tree = &MYTREE;
	MYTREE.left=NULL;
	MYTREE.right=NULL;
	char choice;


	while (1)
	{
		system("cls");
		cout << "\n\n\n\n";
		cout << "\t\t              单链表操作  \n";
		cout << "\t\t======================================";
		cout << "\n\n";
		cout << "\t\t             1:初始化 (随机)     \n";
		cout << "\t\t             2:coffee      \n";
		cout << "\t\t             3:分别先序、中序、后序遍历二叉树   \n";
		cout << "\t\t             4:叶子结点的数目       \n";
		cout << "\t\t             5:树的深度        \n";
		cout << "\t\t             6: 有结点的左、右子树相互交换       \n";
		cout << "\t\t             7: 用数组elem随机数序列,生成二叉排序树     \n";
		cout << "\t\t             8: 排序树中查找结点    \n";
		cout << "\t\t             9: 排序树中删除结点    \n";
		cout << "\t\t========================================pro	     \n";
		cout << "\t\t             z:不用递归,先序遍历       \n";
		cout << "\t\t             x:从根结点开始,逐层从左到右输出各结点      \n";
		cout << "\t\t             c:凹入表示法的表示        \n";
		cout << "\t\t             v:广义表示法的表示        \n";
		cout << "\t\t             w:输出到文件里(MAP)        \n";
		cout << "\t\t             q:输出到文件里(三序)      \n";
		cout << "\t\t             0:退出        \n";
		cout << "\n";
		cout << "\t\t请选择:" << flush;

		choice = getch();
		system("cls");

		switch(choice)
		{
			case '1':
			Tree = init1();
				break;
			case '2':
      coffee();
				break;
			case '3':
			show_in_order(Tree);
				break;
			case '4':
			leaf(Tree);
				break;
			case '5':
			deep(Tree);
				break;
										case '0':
											exit(0);
			case '6':
			cout<<"如果要查看效果,请分别在运行本功能前后生成MAP\n"<<endl;
			Exchange(Tree);
					break;

			case '7':
			sbtree(Tree);
							break;
			case '8':
			findintree(Tree);
			wait();
					           break;
			case '9':
			del_it(Tree);
			               break;
			case 'z':
			preOrder2(Tree);
			wait();
											break;
			case 'w':
			showBinTree(Tree);
			break;
			case 'x':
			leveOrder(Tree);
			wait();
			break;
			case'c':
			printTree(Tree,1);
			wait();
			break;
			case 't':
			generate(Tree);// 测试用 画好的树
			break;
			case 'v':
			GuangYi(Tree);
			wait();
			break;
			case 'q':
			write_in_3_order(Tree);
			wait();
			break;
		}
	}
}
void BENULL(BiTNode *T)     //用来把儿子指向变成null
{
	T->left=NULL;
	T->right=NULL;
}
//三种排序的输出
void Preorder(BiTNode *T)
{
	if(T)
	{
		if(T->data==NULL);
		else{printf("%d ",T->data);}	/*访问结点*/
		Preorder(T->left);
		Preorder(T->right);
	}
}
void Postorder(BiTNode *T)
{
	if(T)
	{
		Postorder(T->left);
		Postorder(T->right);
		if(T->data==NULL);
		else{printf("%d ",T->data);}	/*访问结点*/
	}
}
void Inorder(BiTNode *T)
{
	if(T)
	{
		Inorder(T->left);
		if(T->data==NULL);
		else{printf("%d ",T->data);}	/*访问结点*/
		Inorder(T->right);
	}
}
void show_in_order(BiTNode *T)
{
	cout<<"\n先序遍历:"<<endl;Preorder(T);
	cout<<"\n中序遍历:"<<endl;Inorder(T);
	cout<<"\n后序遍历:"<<endl;Postorder(T);
	wait();
}
//查找叶子节点
void count_leaf(BiTNode *T )
{
  if(T)
  {
    if(T->left==NULL&&NULL==T->right){leaves++;return;}
    count_leaf(T->left);
    count_leaf(T->right);
  }
}
void leaf(BiTNode *T)
{
	count_leaf(T);
	cout<<"叶子节点的总数:"<<leaves<<endl;
	leaves = 0;//计数器归零
	wait();
}
//深度
int depth(BiTNode * root)
{
 int rdepth=0; //根节点深度
int lval=0; //左子树深度
int rval=0; //右子树深度
 if(!root)   //当到达叶子节点的左子树或右子树或整棵树为空树时
	 {
		rdepth=0;
	 }
 else
    {
    lval=depth(root->left);//遍历左子树
    rval=depth(root->right); //遍历右子树

    rdepth=1+(lval>rval?lval:rval);
    }

  return rdepth;
}
void deep(BiTNode * root)
{
  int x;
  x=depth(root);
    cout <<"深度是"<<x<<endl;
		wait();
}
//交换左右
void do_Exchange(BiTNode *bt)
{
    BiTNode *temp;
    if(bt){
        temp = bt -> left;
        bt -> left = bt -> right;
        bt -> right = temp;
        do_Exchange(bt -> left);
        do_Exchange(bt -> right);
    }
}
void Exchange(BiTNode *bt)
{
	do_Exchange(bt);
	cout<<"左右交换已经完成"<<flush;
	wait();
}
//gengrate
void generate(BiTNode *Tree)
{
  cout<<"rrrrrrrrrrrrrrrrrrrrrrrrrrrr"<<endl;
  BiTNode *t;
  t= Tree;
	t->data = 11;

	t->left =(BiTNode*) malloc(sizeof(BiTNode));
	t->left->data=22;
	BENULL(t->left);
	t->right=(BiTNode*) malloc(sizeof(BiTNode));
	t->right->data = 33;
  BENULL(	t->right);
	t->left->left =(BiTNode*) malloc(sizeof(BiTNode));
	t->left->left->data=44;
	BENULL(t->left->left);
	t->right->left=(BiTNode*) malloc(sizeof(BiTNode));
	t->right->left->data=55;
	BENULL(t->right->left);
	t->right->right=(BiTNode*) malloc(sizeof(BiTNode));
	t->right->right->data=66;
	BENULL(t->right->right);
	wait();
}
BiTNode *Generate(int n)
{
	int nl;
	if (n==0)
		return NULL;

	BiTNode *P = new BiTNode;
	P->data = rand() % 999 +1;
	nl=rand() % (n);
	P->left = Generate(nl);
	P->right = Generate(n-1-nl);
	return P;
}
BiTNode *init1()
{
	int i,n;

	while (1)
	{
	    cout << "输入数据个数(0-" << max-1 << "):" << flush;
		cin >> n;
		if (n >= 0 && n <= max-1)
			break;
		cout << endl;
	}
	while (1)
	{
	    cout << "输入随机数种子(0-32767):" << flush;
		cin >> i;
		if (i >= 0 && i <= 32767)
			break;
		cout << endl;
	}
	srand(i);  //指定随机数种子,相同的种子将产生相同的数据序列
	rand();

//	release(Tree);
	return Generate (n);
}
void getWidth(BiTNode *Tree, int depth, int shift, char map[max*2][max*2])
{
	int i;

	if (Tree->left != NULL)
	{
		getWidth(Tree->left, depth+1, shift, map);
		Tree->tem1 = Tree->left->tem1 + Tree->left->tem2 + 1;
		for (i=(Tree->left->tem1+shift)*2; i<shift*2; i=i+2)
		{
			map[depth*2+1][i]='-';
			map[depth*2+1][i+1]='-';
		}
	}
	else Tree->tem1 = 0;
	if (Tree->right != NULL)
	{
		getWidth(Tree->right, depth+1, shift+Tree->tem1+1, map);
		Tree->tem2 = Tree->right->tem1 + Tree->right->tem2 + 1;
	}
	else Tree->tem2 = 0;

	for (i=shift*2; i<(Tree->tem1+shift)*2; i++)
		map[depth*2][i]=' ';

	map[depth*2][(Tree->tem1+shift)*2]=(char)(Tree->data / 1000 +48);
	map[depth*2][(Tree->tem1+shift)*2+1]=(char)(Tree->data / 100 % 10 +48);
	map[depth*2][(Tree->tem1+shift)*2+2]=(char)(Tree->data / 10 % 10 +48);
	map[depth*2][(Tree->tem1+shift)*2+3]=(char)(Tree->data %10 +48);
	if (Tree->data<1000)
	{
		map[depth*2][(Tree->tem1+shift)*2]=' ';
		if (Tree->data<100)
		{
			map[depth*2][(Tree->tem1+shift)*2+1]=map[depth*2][(Tree->tem1+shift)*2+2];
			map[depth*2][(Tree->tem1+shift)*2+2]=map[depth*2][(Tree->tem1+shift)*2+3];
			map[depth*2][(Tree->tem1+shift)*2+3]=' ';
			if (Tree->data<10)
				map[depth*2][(Tree->tem1+shift)*2+1]=' ';
		}
	}

	if (Tree->left != NULL)
	{
		map[depth*2+1][(Tree->left->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->left->tem1+shift)*2+2]=(char)0xb0;
		map[depth*2+1][(Tree->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+shift)*2+2]=(char)0xbc;
		for (i=(Tree->left->tem1+shift)*2+3; i<(Tree->tem1+shift)*2; i=i+2)
		{
			map[depth*2+1][i]=(char)0xa9;
			map[depth*2+1][i+1]=(char)0xa4;
		}
	}
	if (Tree->right != NULL)
	{
		map[depth*2+1][(Tree->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+shift)*2+2]=(char)0xb8;
		map[depth*2+1][(Tree->tem1+Tree->right->tem1+shift)*2+3]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+Tree->right->tem1+shift)*2+4]=(char)0xb4;
		for (i=(Tree->tem1+shift)*2+3; i<(Tree->tem1+Tree->right->tem1+shift)*2+2; i=i+2)
		{
			map[depth*2+1][i]=(char)0xa9;
			map[depth*2+1][i+1]=(char)0xa4;
		}
	}
	if (Tree->left != NULL && Tree->right != NULL)
	{
		map[depth*2+1][(Tree->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+shift)*2+2]=(char)0xd8;
	}

}
void showBinTree(BiTNode *Tree)
{
	char map[max*2][max*2];
	FILE *f;
	int i,j,k;

	f=fopen("Map.txt","w");
	if (Tree == NULL)
	{
		fprintf(f,"空树");
		fclose(f);
		return;
	}
	for (i=0; i<max*2; i++)
		for (j=0; j<max*2; j++)
			map[i][j]=' ';
	getWidth(Tree,0,0,map);
	for (i=0; i<max*2; i++)
	{
		k=max*2-1;
		while (k>=0 && map[i][k]==' ')
			k--;

		for (j=0; j<=k; j++)
			fprintf(f,"%c",map[i][j]);
		fprintf(f,"\n");
//		if (k<0)
//			break;
	}
	fclose(f);
}

//elem
void radom_elem(int list[])
{
	int i,n;
	while (1)
	{
	    cout << "输入数据个数(0-" << max-1 << "):" << flush;
		cin >> n;
		if (n >= 0 && n <= max-1)
			break;
		cout << endl;
	}
	while (1)
	{
	    cout << "输入随机数种子(0-32767):" << flush;
		cin >> i;
		if (i >= 0 && i <= 32767)
			break;
		cout << endl;
	}
	srand(i);  //指定随机数种子,相同的种子将产生相同的数据序列
	rand();

	for (i = 0; i < n; i++)
	{
		list[i] = rand() % 999 +1;
	}
	list[n] = 0;
}
void insertNode(BiTNode*t,int key)
{
	BiTNode*p,*Parent,*Head;
	p=new BiTNode;
	p->data=key;
	BENULL(p);

	Head=t;
	while(Head)
	{
				Parent=Head;
				if(key<Head->data)
							Head=Head->left;
				else
			Head=Head->right;
	}
	if(key<Parent->data)   //注意不是head,一定要用Parent个连接
		Parent->left=p; //连接节点  //新值小于根节点,连接在左子树,否则连接在右子树
	else
		Parent->right=p;
}
void Sort_tree(BiTNode*t)
{
	t->data=elem[0];
	BENULL(t);
	int i;
	for(i=1;elem[i]!=0;i++)
	{
		insertNode(t,elem[i]);
	}
}
void sbtree(BiTNode*Tree){
    cout<<"生成elem[]"<<endl;
		radom_elem(elem);
    Sort_tree(Tree);
		cout<<"bstree完成"<<endl;
  	show_in_order(Tree);
	}

//find
BiTNode *W,*K,*kroot;
int min_k=100000;
void find(BiTNode *T,int key)
{
	if(T)
	{
		find(T->left,key);
		if(key==T->data)
			{
				W=T;
			}
		find(T->right,key);
	}
}

void findintree(BiTNode *T)
{
	cout<<"输入要查找到key:"<<flush;
	int n;
	cin>>n;
	W=NULL;
	find(T,n);
	if(W==NULL)printf("树中没有要查找的数字\n" );
	else
	 printf("树中有该数字,指针:%p\n",&W );
}

void find_min(BiTNode *T)
{
	cout<<"entered min"<<endl;
	if(T)
	{
			if(min_k>T->data)
				{
					cout<<"swap>-<"<<endl;
					min_k=T->data;
					K=T;
				}
		find_min(T->left);
		find_min(T->right);
	}
}
void del_ing(BiTNode *&kill)
{
	if(kill->left==NULL&&kill->right==NULL)
	{
			kill->data=0;
	}

	else if(NULL==kill->right)
	{
		kill->data=0;
	  kill=kill->left;
	}
		else
		{
			find_min(kill->right);
			cout<<"minbac K="<<K->data<<endl;
			kill->data = K->data;
			K->data=0;
		}
}
void del_it(BiTNode *T)
{
			printf("PS:我输出了一些方便我调试的东西 请多见谅\n" );
		cout<<"输入要del的key:"<<flush;
		int n;
		cin>>n;
		W=NULL;
		find(T,n);
		if(W==NULL)printf("树中没有要del的数字\n" );

		else
		{
			printf("deleting^^^\n" );
			K=NULL;
			kroot=NULL;
			del_ing(W);
		}
		printf("=====================DELETE COMPLETE\n" );
		show_in_order(Tree);
}
//
void preOrder2(BiTNode *root)     //非递归前序遍历
{
	  stack<BiTNode*>s;
    BiTNode *p=root;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)
        {
            cout<<p->data<<" ";
            s.push(p);
            p=p->left;
        }
        if(!s.empty())
        {
            p=s.top();
            s.pop();
            p=p->right;
        }
    }
}
//
void leveOrder(BiTNode *root)
{
	  queue<BiTNode*>s;
    BiTNode *disp,*p=root;
		s.push(p);
  		while (!s.empty())
				{
					disp=s.front();
					s.pop();
					cout<<disp->data<<" "<<flush;
					if(p->left)s.push(p->left);
					if(p->right)s.push(p->right);
					p=s.front();
				}
}
//
void printTree(BiTNode *t,int space)
{
    /*如果为空树,return;*/
    if(t==NULL) return ;
    /*输出根*/
    int i,j,k;
    for(i=0;i<space;i++) printf(" ");
    printf("%d\n",t->data);
    /*输出子树*/
    if(t->left)printTree(t->left,space+3);
		if(t->right)printTree(t->right,space+3);
}
//
void GuangYi(BiTNode *T)
{
	if(T)
	{
		if(T->data==NULL);
		else{printf("%d ",T->data);}	/*访问结点*/
		cout<<"("<<flush;
		GuangYi(T->left);
		GuangYi(T->right);
		cout<<")"<<flush;
	}
}
//
void wPreorder(BiTNode *T,FILE *&fp)
{
	if(T)
	{
		if(T->data==NULL);
		else{fprintf(fp,"%d ",T->data);}	/*访问结点*/
		wPreorder(T->left,fp);
		wPreorder(T->right,fp);
	}
}
void wPostorder(BiTNode *T,FILE *&fp)
{
	if(T)
	{
		wPostorder(T->left,fp);
		wPostorder(T->right,fp);
		if(T->data==NULL);
		else{fprintf(fp,"%d ",T->data);}	/*访问结点*/
	}
}
void wInorder(BiTNode *T,FILE *&fp)
{
	if(T)
	{
		wInorder(T->left,fp);
		if(T->data==NULL);
		else{fprintf(fp,"%d ",T->data);}	/*访问结点*/
		wInorder(T->right,fp);
	}
}
void write_in_3_order(BiTNode *T)
{
	cout<<"在同一文件夹下的test.txt将会被写入"<<endl;
	FILE *fp = NULL;
	fp = fopen("test.txt", "w+");
	fprintf(fp,"\nPREorder  :");
  wPreorder(Tree,fp);
	fprintf(fp,"\nINorder    :");
	wInorder(Tree,fp);
	fprintf(fp,"\nPOSTorder:");
	wPostorder(Tree,fp);
	fclose(fp);
	cout<<"写--入--完--成--"<<endl;
}








void coffee()
{
cout<<
"					       _==/          i     i          \==_             \n"
"					     /XX/            |\___/|            \XX\           \n"
"					   /XXXX\            |XXXXX|            /XXXX\             \n"
"					  |XXXXXX\_         _XXXXXXX_         _/XXXXXX|            \n"
"					 XXXXXXXXXXXxxxxxxxXXXXXXXXXXXxxxxxxxXXXXXXXXXXX             \n"
"					|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|             \n"
"					XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX             \n"
"					|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|             \n"
"					 XXXXXX/^^^^^\XXXXXXXXXXXXXXXXXXXXX/^^^^^\XXXXXX             \n"
"					  |XXX|       \XXX/^^\XXXXX/^^\XXX/       |XXX|             \n"
"					      \XX\       \X/    \XXX/    \X/       /XX/             \n"
"		    			       *\       *      \X/      *      /*               \n "<<endl;
			wait();}

 老师提供了一个bint.h 

可以输出 W 那种树 挺厉害的 我是写不来 就直接用了;

 

附上BINT.h

//屏幕提示后,从键盘输入个数和随机数种子,在数组elem中生成指定个数的数据,供其他程序使用,0表示数据结束
void init0(int list[])
{
	int i,n;
	while (1)
	{
	    cout << "输入数据个数(0-" << max-1 << "):" << flush;
		cin >> n;
		if (n >= 0 && n <= max-1)
			break;
		cout << endl;
	}
	while (1)
	{
	    cout << "输入随机数种子(0-32767):" << flush;
		cin >> i;
		if (i >= 0 && i <= 32767)
			break;
		cout << endl;
	}
	srand(i);  //指定随机数种子,相同的种子将产生相同的数据序列
	rand();

	for (i = 0; i < n; i++)
	{
		list[i] = rand() % 999 +1;
	}
	list[n] = 0;
}

void getWidth(BiTNode *Tree, int depth, int shift, char map[max*2][max*2])
{
	int i;

	if (Tree->left != NULL)
	{
		getWidth(Tree->left, depth+1, shift, map);
		Tree->tem1 = Tree->left->tem1 + Tree->left->tem2 + 1;
		for (i=(Tree->left->tem1+shift)*2; i<shift*2; i=i+2)
		{
			map[depth*2+1][i]='-';
			map[depth*2+1][i+1]='-';
		}
	}
	else Tree->tem1 = 0;
	if (Tree->right != NULL)
	{
		getWidth(Tree->right, depth+1, shift+Tree->tem1+1, map);
		Tree->tem2 = Tree->right->tem1 + Tree->right->tem2 + 1;
	}
	else Tree->tem2 = 0;

	for (i=shift*2; i<(Tree->tem1+shift)*2; i++)
		map[depth*2][i]=' ';
	
	map[depth*2][(Tree->tem1+shift)*2]=(char)(Tree->data / 1000 +48);
	map[depth*2][(Tree->tem1+shift)*2+1]=(char)(Tree->data / 100 % 10 +48);
	map[depth*2][(Tree->tem1+shift)*2+2]=(char)(Tree->data / 10 % 10 +48);
	map[depth*2][(Tree->tem1+shift)*2+3]=(char)(Tree->data %10 +48);
	if (Tree->data<1000)
	{
		map[depth*2][(Tree->tem1+shift)*2]=' ';
		if (Tree->data<100)
		{
			map[depth*2][(Tree->tem1+shift)*2+1]=map[depth*2][(Tree->tem1+shift)*2+2];
			map[depth*2][(Tree->tem1+shift)*2+2]=map[depth*2][(Tree->tem1+shift)*2+3];
			map[depth*2][(Tree->tem1+shift)*2+3]=' ';
			if (Tree->data<10)
				map[depth*2][(Tree->tem1+shift)*2+1]=' ';
		}
	}

	if (Tree->left != NULL)
	{
		map[depth*2+1][(Tree->left->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->left->tem1+shift)*2+2]=(char)0xb0;
		map[depth*2+1][(Tree->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+shift)*2+2]=(char)0xbc;
		for (i=(Tree->left->tem1+shift)*2+3; i<(Tree->tem1+shift)*2; i=i+2)
		{
			map[depth*2+1][i]=(char)0xa9;
			map[depth*2+1][i+1]=(char)0xa4;
		}
	}
	if (Tree->right != NULL)
	{
		map[depth*2+1][(Tree->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+shift)*2+2]=(char)0xb8;
		map[depth*2+1][(Tree->tem1+Tree->right->tem1+shift)*2+3]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+Tree->right->tem1+shift)*2+4]=(char)0xb4;
		for (i=(Tree->tem1+shift)*2+3; i<(Tree->tem1+Tree->right->tem1+shift)*2+2; i=i+2)
		{
			map[depth*2+1][i]=(char)0xa9;
			map[depth*2+1][i+1]=(char)0xa4;
		}
	}
	if (Tree->left != NULL && Tree->right != NULL)
	{
		map[depth*2+1][(Tree->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+shift)*2+2]=(char)0xd8;
	}

}

//生成文件Map.txt,显示以Tree为根指针的二叉树
void showBinTree(BiTNode *Tree)
{
	char map[max*2][max*2];
	FILE *f;
	int i,j,k;

	f=fopen("Map.txt","w");
	if (Tree == NULL)
	{
		fprintf(f,"空树");
		fclose(f);
		return;
	}
	for (i=0; i<max*2; i++)
		for (j=0; j<max*2; j++)
			map[i][j]=' ';
	getWidth(Tree,0,0,map);
	for (i=0; i<max*2; i++)
	{
		k=max*2-1; 
		while (k>=0 && map[i][k]==' ')
			k--;

		for (j=0; j<=k; j++)
			fprintf(f,"%c",map[i][j]);
		fprintf(f,"\n");
//		if (k<0)
//			break;
	}
	fclose(f);
}

//供init1O调用的释放函数
void release(BiTNode *Tree)
{
	if (Tree==NULL)
		return;
	release(Tree->left);
	release(Tree->right);
	free(Tree);
}

//供init1调用的生成函数
BiTNode *Generate(int n)
{
	int nl;
	if (n==0)
		return NULL;

	BiTNode *P = new BiTNode;
	P->data = rand() % 999 +1;
	nl=rand() % (n);
	P->left = Generate(nl);
	P->right = Generate(n-1-nl);
	return P;
}

//屏幕提示后,从键盘输入个数和随机数种子,以Tree为根指针,生成指定结点个数的二叉树,供其他程序使用,同时生成文件Map.txt,显示这课二叉树
BiTNode *init1()
{
	int i,n;

	while (1)
	{
	    cout << "输入数据个数(0-" << max-1 << "):" << flush;
		cin >> n;
		if (n >= 0 && n <= max-1)
			break;
		cout << endl;
	}
	while (1)
	{
	    cout << "输入随机数种子(0-32767):" << flush;
		cin >> i;
		if (i >= 0 && i <= 32767)
			break;
		cout << endl;
	}
	srand(i);  //指定随机数种子,相同的种子将产生相同的数据序列
	rand();

//	release(Tree);
	return Generate (n);
}

 


p3--for VC6.0

ps:因为老师只会vc 老娘只能给改出来一个特别版本,献给同样老师是老顽固 VC6使用者的孩子们:

/*
	源文件名:P5.cpp
	功能:二叉树操作
*/
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stack>
#include <queue>
using namespace std;
 struct BiTNode        //二叉树结点类型
{
	int data;         //数据
		int tem1,tem2;    //辅助数据(实习题不用)
	BiTNode *left;    //左子树指针
	BiTNode *right;   //右子树指针
};
//放置全局变量的位置
#define max 100
int leaves = 0;
BiTNode MYTREE;
BiTNode *Tree;      //本程序操作的二叉树根指针
int elem[max];        //存放原始数据
//放置函数声明的位置
void wait(){
	cout << "\n请按任意键继续\n" << flush;
	getch();
}
void generate(BiTNode *Tree);
void show_in_order(BiTNode *T);
void leaf(BiTNode *T);
void deep(BiTNode * root);
void Exchange(BiTNode *bt);
void CreateTree(BiTNode *T);
void sbtree(BiTNode*Tree);
void coffee();
BiTNode *init1();
void showBinTree(BiTNode *Tree);
void findintree(BiTNode *T);
void del_it(BiTNode *T);
void preOrder2(BiTNode *root);
void leveOrder(BiTNode *root);
void printTree(BiTNode *t,int space);
void GuangYi(BiTNode *T);
void write_in_3_order(BiTNode *T);
void main()
{
	Tree = &MYTREE;
	MYTREE.left=NULL;
	MYTREE.right=NULL;
	char choice;


	while (1)
	{
		system("cls");
		cout << "\n\n\n\n";
		cout << "\t\t              单链表操作  \n";
		cout << "\t\t======================================";
		cout << "\n\n";
		cout << "\t\t             1:初始化 (随机)     \n";
		cout << "\t\t             2:coffee      \n";
		cout << "\t\t             3:分别先序、中序、后序遍历二叉树   \n";
		cout << "\t\t             4:叶子结点的数目       \n";
		cout << "\t\t             5:树的深度        \n";
		cout << "\t\t             6: 有结点的左、右子树相互交换       \n";
		cout << "\t\t             7: 用数组elem随机数序列,生成二叉排序树     \n";
		cout << "\t\t             8: 排序树中查找结点    \n";
		cout << "\t\t             9: 排序树中删除结点    \n";
		cout << "\t\t========================================pro	     \n";
		cout << "\t\t             z:不用递归,先序遍历       \n";
		cout << "\t\t             x:从根结点开始,逐层从左到右输出各结点      \n";
		cout << "\t\t             c:凹入表示法的表示        \n";
		cout << "\t\t             v:广义表示法的表示        \n";
		cout << "\t\t             w:输出到文件里(MAP)        \n";
		cout << "\t\t             q:输出到文件里(三序)      \n";
		cout << "\t\t             0:退出        \n";
		cout << "\n";
		cout << "\t\t请选择:" << flush;

		choice = getch();
		system("cls");

		switch(choice)
		{
			case '1':
			Tree = init1();
				break;
			case '2':
      coffee();
				break;
			case '3':
			show_in_order(Tree);
				break;
			case '4':
			leaf(Tree);
				break;
			case '5':
			deep(Tree);
				break;
										case '0':
											exit(0);
			case '6':
			cout<<"如果要查看效果,请分别在运行本功能前后生成MAP\n"<<endl;
			Exchange(Tree);
					break;

			case '7':
			sbtree(Tree);
							break;
			case '8':
			findintree(Tree);
			wait();
					           break;
			case '9':
			del_it(Tree);
			               break;
			case 'z':
			preOrder2(Tree);
			wait();
											break;
			case 'w':
			showBinTree(Tree);
			break;
			case 'x':
			leveOrder(Tree);
			wait();
			break;
			case'c':
			printTree(Tree,1);
			wait();
			break;
			case 't':
			generate(Tree);// 测试用 画好的树
			break;
			case 'v':
			GuangYi(Tree);
			wait();
			break;
			case 'q':
			write_in_3_order(Tree);
			wait();
			break;
		}
	}
}
void BENULL(BiTNode *T)     //用来把儿子指向变成null
{
	T->left=NULL;
	T->right=NULL;
}
//三种排序的输出
void Preorder(BiTNode *T)
{
	if(T)
	{
		if(T->data==NULL);
		else{printf("%d ",T->data);}	/*访问结点*/
		Preorder(T->left);
		Preorder(T->right);
	}
}
void Postorder(BiTNode *T)
{
	if(T)
	{
		Postorder(T->left);
		Postorder(T->right);
		if(T->data==NULL);
		else{printf("%d ",T->data);}	/*访问结点*/
	}
}
void Inorder(BiTNode *T)
{
	if(T)
	{
		Inorder(T->left);
		if(T->data==NULL);
		else{printf("%d ",T->data);}	/*访问结点*/
		Inorder(T->right);
	}
}
void show_in_order(BiTNode *T)
{
	cout<<"\n先序遍历:"<<endl;Preorder(T);
	cout<<"\n中序遍历:"<<endl;Inorder(T);
	cout<<"\n后序遍历:"<<endl;Postorder(T);
	wait();
}
//查找叶子节点
void count_leaf(BiTNode *T )
{
  if(T)
  {
    if(T->left==NULL&&NULL==T->right){leaves++;return;}
    count_leaf(T->left);
    count_leaf(T->right);
  }
}
void leaf(BiTNode *T)
{
	count_leaf(T);
	cout<<"叶子节点的总数:"<<leaves<<endl;
	leaves = 0;//计数器归零
	wait();
}
//深度
int depth(BiTNode * root)
{
 int rdepth=0; //根节点深度
int lval=0; //左子树深度
int rval=0; //右子树深度
 if(!root)   //当到达叶子节点的左子树或右子树或整棵树为空树时
	 {
		rdepth=0;
	 }
 else
    {
    lval=depth(root->left);//遍历左子树
    rval=depth(root->right); //遍历右子树

    rdepth=1+(lval>rval?lval:rval);
    }

  return rdepth;
}
void deep(BiTNode * root)
{
  int x;
  x=depth(root);
    cout <<"深度是"<<x<<endl;
		wait();
}
//交换左右
void do_Exchange(BiTNode *bt)
{
    BiTNode *temp;
    if(bt){
        temp = bt -> left;
        bt -> left = bt -> right;
        bt -> right = temp;
        do_Exchange(bt -> left);
        do_Exchange(bt -> right);
    }
}
void Exchange(BiTNode *bt)
{
	do_Exchange(bt);
	cout<<"左右交换已经完成"<<flush;
	wait();
}
//gengrate
void generate(BiTNode *Tree)
{
  cout<<"rrrrrrrrrrrrrrrrrrrrrrrrrrrr"<<endl;
  BiTNode *t;
  t= Tree;
	t->data = 11;

	t->left =(BiTNode*) malloc(sizeof(BiTNode));
	t->left->data=22;
	BENULL(t->left);
	t->right=(BiTNode*) malloc(sizeof(BiTNode));
	t->right->data = 33;
  BENULL(	t->right);
	t->left->left =(BiTNode*) malloc(sizeof(BiTNode));
	t->left->left->data=44;
	BENULL(t->left->left);
	t->right->left=(BiTNode*) malloc(sizeof(BiTNode));
	t->right->left->data=55;
	BENULL(t->right->left);
	t->right->right=(BiTNode*) malloc(sizeof(BiTNode));
	t->right->right->data=66;
	BENULL(t->right->right);
	wait();
}
BiTNode *Generate(int n)
{
	int nl;
	if (n==0)
		return NULL;

	BiTNode *P = new BiTNode;
	P->data = rand() % 999 +1;
	nl=rand() % (n);
	P->left = Generate(nl);
	P->right = Generate(n-1-nl);
	return P;
}
BiTNode *init1()
{
	int i,n;

	while (1)
	{
	    cout << "输入数据个数(0-" << max-1 << "):" << flush;
		cin >> n;
		if (n >= 0 && n <= max-1)
			break;
		cout << endl;
	}
	while (1)
	{
	    cout << "输入随机数种子(0-32767):" << flush;
		cin >> i;
		if (i >= 0 && i <= 32767)
			break;
		cout << endl;
	}
	srand(i);  //指定随机数种子,相同的种子将产生相同的数据序列
	rand();

//	release(Tree);
	return Generate (n);
}
void getWidth(BiTNode *Tree, int depth, int shift, char map[max*2][max*2])
{
	int i;

	if (Tree->left != NULL)
	{
		getWidth(Tree->left, depth+1, shift, map);
		Tree->tem1 = Tree->left->tem1 + Tree->left->tem2 + 1;
		for (i=(Tree->left->tem1+shift)*2; i<shift*2; i=i+2)
		{
			map[depth*2+1][i]='-';
			map[depth*2+1][i+1]='-';
		}
	}
	else Tree->tem1 = 0;
	if (Tree->right != NULL)
	{
		getWidth(Tree->right, depth+1, shift+Tree->tem1+1, map);
		Tree->tem2 = Tree->right->tem1 + Tree->right->tem2 + 1;
	}
	else Tree->tem2 = 0;

	for (i=shift*2; i<(Tree->tem1+shift)*2; i++)
		map[depth*2][i]=' ';

	map[depth*2][(Tree->tem1+shift)*2]=(char)(Tree->data / 1000 +48);
	map[depth*2][(Tree->tem1+shift)*2+1]=(char)(Tree->data / 100 % 10 +48);
	map[depth*2][(Tree->tem1+shift)*2+2]=(char)(Tree->data / 10 % 10 +48);
	map[depth*2][(Tree->tem1+shift)*2+3]=(char)(Tree->data %10 +48);
	if (Tree->data<1000)
	{
		map[depth*2][(Tree->tem1+shift)*2]=' ';
		if (Tree->data<100)
		{
			map[depth*2][(Tree->tem1+shift)*2+1]=map[depth*2][(Tree->tem1+shift)*2+2];
			map[depth*2][(Tree->tem1+shift)*2+2]=map[depth*2][(Tree->tem1+shift)*2+3];
			map[depth*2][(Tree->tem1+shift)*2+3]=' ';
			if (Tree->data<10)
				map[depth*2][(Tree->tem1+shift)*2+1]=' ';
		}
	}

	if (Tree->left != NULL)
	{
		map[depth*2+1][(Tree->left->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->left->tem1+shift)*2+2]=(char)0xb0;
		map[depth*2+1][(Tree->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+shift)*2+2]=(char)0xbc;
		for (i=(Tree->left->tem1+shift)*2+3; i<(Tree->tem1+shift)*2; i=i+2)
		{
			map[depth*2+1][i]=(char)0xa9;
			map[depth*2+1][i+1]=(char)0xa4;
		}
	}
	if (Tree->right != NULL)
	{
		map[depth*2+1][(Tree->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+shift)*2+2]=(char)0xb8;
		map[depth*2+1][(Tree->tem1+Tree->right->tem1+shift)*2+3]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+Tree->right->tem1+shift)*2+4]=(char)0xb4;
		for (i=(Tree->tem1+shift)*2+3; i<(Tree->tem1+Tree->right->tem1+shift)*2+2; i=i+2)
		{
			map[depth*2+1][i]=(char)0xa9;
			map[depth*2+1][i+1]=(char)0xa4;
		}
	}
	if (Tree->left != NULL && Tree->right != NULL)
	{
		map[depth*2+1][(Tree->tem1+shift)*2+1]=(char)0xa9;
		map[depth*2+1][(Tree->tem1+shift)*2+2]=(char)0xd8;
	}

}
void showBinTree(BiTNode *Tree)
{
	char map[max*2][max*2];
	FILE *f;
	int i,j,k;

	f=fopen("Map.txt","w");
	if (Tree == NULL)
	{
		fprintf(f,"空树");
		fclose(f);
		return;
	}
	for (i=0; i<max*2; i++)
		for (j=0; j<max*2; j++)
			map[i][j]=' ';
	getWidth(Tree,0,0,map);
	for (i=0; i<max*2; i++)
	{
		k=max*2-1;
		while (k>=0 && map[i][k]==' ')
			k--;

		for (j=0; j<=k; j++)
			fprintf(f,"%c",map[i][j]);
		fprintf(f,"\n");
//		if (k<0)
//			break;
	}
	fclose(f);
}

//elem
void radom_elem(int list[])
{
	int i,n;
	while (1)
	{
	    cout << "输入数据个数(0-" << max-1 << "):" << flush;
		cin >> n;
		if (n >= 0 && n <= max-1)
			break;
		cout << endl;
	}
	while (1)
	{
	    cout << "输入随机数种子(0-32767):" << flush;
		cin >> i;
		if (i >= 0 && i <= 32767)
			break;
		cout << endl;
	}
	srand(i);  //指定随机数种子,相同的种子将产生相同的数据序列
	rand();

	for (i = 0; i < n; i++)
	{
		list[i] = rand() % 999 +1;
	}
	list[n] = 0;
}
void insertNode(BiTNode*t,int key)
{
	BiTNode*p,*Parent,*Head;
	p=new BiTNode;
	p->data=key;
	BENULL(p);

	Head=t;
	while(Head)
	{
				Parent=Head;
				if(key<Head->data)
							Head=Head->left;
				else
			Head=Head->right;
	}
	if(key<Parent->data)   //注意不是head,一定要用Parent个连接
		Parent->left=p; //连接节点  //新值小于根节点,连接在左子树,否则连接在右子树
	else
		Parent->right=p;
}
void Sort_tree(BiTNode*t)
{
	t->data=elem[0];
	BENULL(t);
	int i;
	for(i=1;elem[i]!=0;i++)
	{
		insertNode(t,elem[i]);
	}
}
void sbtree(BiTNode*Tree){
    cout<<"生成elem[]"<<endl;
		radom_elem(elem);
    Sort_tree(Tree);
		cout<<"bstree完成"<<endl;
  	show_in_order(Tree);
	}

//find
BiTNode *W,*K,*kroot;
int min_k=100000;
void find(BiTNode *T,int key)
{
	if(T)
	{
		find(T->left,key);
		if(key==T->data)
			{
				W=T;
			}
		find(T->right,key);
	}
}

void findintree(BiTNode *T)
{
	cout<<"输入要查找到key:"<<flush;
	int n;
	cin>>n;
	W=NULL;
	find(T,n);
	if(W==NULL)printf("树中没有要查找的数字\n" );
	else
	 printf("树中有该数字,指针:%p\n",&W );
}

void find_min(BiTNode *T)
{
	cout<<"entered min"<<endl;
	if(T)
	{
			if(min_k>T->data)
				{
					cout<<"swap>-<"<<endl;
					min_k=T->data;
					K=T;
				}
		find_min(T->left);
		find_min(T->right);
	}
}
void del_ing(BiTNode *&kill)
{
	if(kill->left==NULL&&kill->right==NULL)
	{
			kill->data=0;
	}

	else if(NULL==kill->right)
	{
		kill->data=0;
	  kill=kill->left;
	}
		else
		{
			find_min(kill->right);
			cout<<"minbac K="<<K->data<<endl;
			kill->data = K->data;
			K->data=0;
		}
}
void del_it(BiTNode *T)
{
			printf("PS:我输出了一些方便我调试的东西 请多见谅\n" );
		cout<<"输入要del的key:"<<flush;
		int n;
		cin>>n;
		W=NULL;
		find(T,n);
		if(W==NULL)printf("树中没有要del的数字\n" );

		else
		{
			printf("deleting^^^\n" );
			K=NULL;
			kroot=NULL;
			del_ing(W);
		}
		printf("=====================DELETE COMPLETE\n" );
		show_in_order(Tree);
}
//
void preOrder2(BiTNode *root)     //非递归前序遍历
{
	  stack<BiTNode*>s;
    BiTNode *p=root;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)
        {
            cout<<p->data<<" ";
            s.push(p);
            p=p->left;
        }
        if(!s.empty())
        {
            p=s.top();
            s.pop();
            p=p->right;
        }
    }
}
//
void leveOrder(BiTNode *root)
{
	  queue<BiTNode*>s;
    BiTNode *disp,*p=root;
		s.push(p);
  		while (!s.empty())
				{
					disp=s.front();
					s.pop();
					cout<<disp->data<<" "<<flush;
					if(p->left)s.push(p->left);
					if(p->right)s.push(p->right);
					p=s.front();
				}
}
//
void printTree(BiTNode *t,int space)
{
    /*如果为空树,return;*/
    if(t==NULL) return ;
    /*输出根*/
    int i,j,k;
    for(i=0;i<space;i++) printf(" ");
    printf("%d\n",t->data);
    /*输出子树*/
    if(t->left)printTree(t->left,space+3);
		if(t->right)printTree(t->right,space+3);
}
//
void GuangYi(BiTNode *T)
{
	if(T)
	{
		if(T->data==NULL);
		else{printf("%d ",T->data);}	/*访问结点*/
		cout<<"("<<flush;
		GuangYi(T->left);
		GuangYi(T->right);
		cout<<")"<<flush;
	}
}
//
void wPreorder(BiTNode *T,FILE *&fp)
{
	if(T)
	{
		if(T->data==NULL);
		else{fprintf(fp,"%d ",T->data);}	/*访问结点*/
		wPreorder(T->left,fp);
		wPreorder(T->right,fp);
	}
}
void wPostorder(BiTNode *T,FILE *&fp)
{
	if(T)
	{
		wPostorder(T->left,fp);
		wPostorder(T->right,fp);
		if(T->data==NULL);
		else{fprintf(fp,"%d ",T->data);}	/*访问结点*/
	}
}
void wInorder(BiTNode *T,FILE *&fp)
{
	if(T)
	{
		wInorder(T->left,fp);
		if(T->data==NULL);
		else{fprintf(fp,"%d ",T->data);}	/*访问结点*/
		wInorder(T->right,fp);
	}
}
void write_in_3_order(BiTNode *T)
{
	cout<<"在同一文件夹下的test.txt将会被写入"<<endl;
	FILE *fp = NULL;
	fp = fopen("test.txt", "w+");
	fprintf(fp,"\nPREorder  :");
  wPreorder(Tree,fp);
	fprintf(fp,"\nINorder    :");
	wInorder(Tree,fp);
	fprintf(fp,"\nPOSTorder:");
	wPostorder(Tree,fp);
	fclose(fp);
	cout<<"写--入--完--成--"<<endl;
}








void coffee()
{
cout<<
"					       _==/          i     i          \==_             \n"
"					     /XX/            |\___/|            \XX\           \n"
"					   /XXXX\            |XXXXX|            /XXXX\             \n"
"					  |XXXXXX\_         _XXXXXXX_         _/XXXXXX|            \n"
"					 XXXXXXXXXXXxxxxxxxXXXXXXXXXXXxxxxxxxXXXXXXXXXXX             \n"
"					|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|             \n"
 "					XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX             \n"
"					|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|             \n"
 "					 XXXXXX/^^^^^\XXXXXXXXXXXXXXXXXXXXX/^^^^^\XXXXXX             \n"
 "					  |XXX|       \XXX/^^\XXXXX/^^\XXX/       |XXX|             \n"
 "					      \XX\       \X/    \XXX/    \X/       /XX/             \n"
"		    			       *\       *      \X/      *      /*               \n "<<endl;
			wait();}

 树是真的难写

指针瞎几把指 会让人很难受

现在我的结构成绩还是没出来

实习成绩都出来了


Thank you for reading my essay.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值