有关树的操作的实习作业
为啥我标题写错了。。。现在才发现。。。。
大部分要求的功能呢,老娘都写出来了来着 哈夫曼树那种特别难写分又少的我就没有写 ~_~
但是由于种种不可抗力的原因,我的删除功能是假的 会用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.