数据结构之排序二叉树操作
来源:互联网 发布:淘宝充值 赚客吧 编辑:程序博客网 时间:2024/06/06 20:33
#include <stdio.h>#include <malloc.h> #include <ctype.h># define MAXSIZE 40 // 待排顺序表最大长度 int corect=0;#define OK 1#define ERROR 0typedef int KeyType; // 关键字类型为整数类型typedef int ElemType; // 数据类型为整数类型//数据结构定义模块typedef struct{ //记录类型 KeyType key; // 关键字域 ElemType data; // 其它属性域,存储要存储的数据}RcdType,*TRcdType;typedef struct{ //数据表RcdType r[MAXSIZE]; //数组中r[0]空出int length; //数据表长度}Arglist,*TArglist;typedef struct BiTNode{ // 结点结构 RcdType data; //结点存储数据为记录类型 struct BiTNode *lchild,*rchild; // 左右孩子指针}BiTNode,*BiTree;BiTree root,p,f,g;//初始一个空二叉树int createbitree(BiTree &T){//初始化二叉树T为空T=(BiTree)malloc(sizeof(BiTNode));if(!T) {printf("空间分配出错!\n");return 0;}T=NULL;return 1;}//createbitree//数据表生成及显示模块TArglist create(TArglist &L){//生成有n个数据元素的数据表,并返回数据表头指针int i;L->r[0].data=L->r[0].key=0;printf("请输入数据表元素,格式为(关键字 数据)(注意:数据类型均为整型且各元素关键字需不同!):\n");for(i=1;i<=L->length;i++){scanf("%d %d",&L->r[i].key,&L->r[i].data);}return L;}//createint printarg(TArglist L){//打印出所生成的数据表int i;for(i=1;i<=L->length;i++)printf("%d %d \n",L->r[i].key,L->r[i].data);printf("\n");return 1;}//printargint scanarg(TArglist &L){//数据表输入及打印函数printf("请您输入要创建的数据表的长度(请输入3~%d的整数!):\n",MAXSIZE);scanf("%d",&L->length);if(!(L->length<=MAXSIZE&&L->length>=3)){printf("输入非法!请重新输入!\n");scanarg(L);}L=create(L); printf("生成的数据表为(关键字 数据):\n");printarg(L);return 1;}//scanarg//自动生成二叉排序树int compare(BiTree &q,TArglist L,int i){//递归法建立二叉排序树if(L->r[i].key==q->data.key){printf("输入数据表中存在关键字相同的元素,请重新进行建树操作!\n");corect=0;return 0;}else if(L->r[i].key>q->data.key){ //若该结点关键字比r[i]大,且其右子树为空则创建其右子树为r[i];否则比较其右子树if(q->rchild==0){q->rchild=(BiTree)malloc(sizeof(BiTNode));if(!q->rchild){printf("程序运行出错!\n");return ERROR;}else{q->rchild->data=L->r[i];q->rchild->lchild=NULL;q->rchild->rchild=NULL;}}else compare(q->rchild,L,i);}else if(L->r[i].key<q->data.key){ //若该结点关键字比r[i]小,且其左子树为空则创建其左子树为r[i];否则比较其左子树if(q->lchild==0){q->lchild=(BiTree)malloc(sizeof(BiTNode));if(!q->lchild){printf("程序运行出错!\n");return 0;}else{q->lchild->data=L->r[i];q->lchild->lchild=NULL;q->lchild->rchild=NULL;}} else compare(q->lchild,L,i);}return 1;}//compareint creatBiTree(BiTree &root,TArglist L){ //创建二叉排序树int i=1; if (L->r[i].key){root=(BiTree)malloc(sizeof(BiTNode));root->data.key=L->r[i].key;root->data.data=L->r[i].data;root->lchild=root->rchild=NULL;}else{printf("程序运行出错!\n");return ERROR;}for(++i;i<=L->length;i++)compare(root,L,i);if(corect)printf("建树操作已完成!\n");return 1;}//creatBiTree//查找模块int SearchBST(BiTree T,KeyType k,BiTree &f,BiTree &p){//在根指针T所指二叉排序树中递归地查找其关键字等于k的数据元素,//若查找成功,则返回指针p指向该数据元素的结点,并返回函数值为OK; //否则表明查找不成功,返回指针p指向查找路径上访问的最后一个结点, //并返回函数值为ERROR; 指针f指向当前访问的结点的双亲,其初始调用值为NULL。if(!T){ // 二叉排序树不为空 查找不成功p=f;return 0;} else if(k==T->data.key){ // 查找成功p=T;g=f;printf("查找到了关键字为%d的元素:\n 关键字为:%d 数据为:%d \n",p->data.key,p->data.key,p->data.data);return OK;} else if(k<T->data.key) SearchBST(T->lchild,k,T,p); // 在左子树中继续查找else SearchBST(T->rchild,k,T,p); // 在右子树中继续查找 } // SearchBST //二叉排序树的插入算法int InsertBST(BiTree &T,TRcdType e,BiTree &f,BiTree &p){//当二叉排序树中不存在关键字等e.key的数据元素时,插入元素值为e的结点,并返回TRUE;否则,不进行插入并提示和返回FALSEBiTree s;if(!SearchBST(T,e->key,f,p)){s=(BiTree)malloc(sizeof(BiTNode)); //为新结点分配空间s->data.data=e->data;s->data.key=e->key; s->lchild=s->rchild=NULL; if(!p)T=s; //插入s为新的根结点else if(e->key<p->data.key) p->lchild=s; //插入*s为*p的左孩子else p->rchild=s; //插入*s为*p的右孩子printf("插入操作已完成!\n");return OK; //插入成功 }else {printf("要插入的数据已存在,插入操作失败!\n");return ERROR;}} // InsertBST //二叉排序树的删除算法int DeleteBST(BiTree &T,KeyType k){//若二叉排序树T中存在其关键字等于k的数据元素,则删除该数据元素结点,并返回函数值TRUE,否则返回函数值FALSEBiTree q;createbitree(q);if(!T||!SearchBST(T,k,f,p)){ // 不存在关键字等于kval的数据元素printf("未找到要删除的元素。删除操作失败!\n");return ERROR;}else if(g->lchild==p){if(!p->rchild&&p->lchild){ //右子树为空树则只需重接其左子树g->lchild=p->lchild; q=p;free(q);return OK;}else if(p->rchild&&!p->lchild){//左子树为空只需重接其右子树g->lchild=p->rchild;q=p;free(q);return OK;}else if(p->rchild&&p->lchild){q=p;free(q);return OK;}}else {if(!p->rchild&&p->lchild){ //右子树为空树则只需重接它的左子树g->rchild=p->lchild; q=p;free(q);return OK;}else if(p->rchild&&!p->lchild){ // 左子树为空树只需重接它的右子树g->rchild=p->rchild;q=p;free(q);return OK;}else if(p->rchild&&p->lchild){q=p;free(q);return OK;}} }//DeleteBST int visit(BiTree &T){//对数据元素操作的应用函数printf("%d %d \n",T->data.key,T->data.data);return OK;}//visitint preordertraverse(BiTree &t){ //先序遍历if(t){if(visit(t))if(preordertraverse(t->lchild)) if(preordertraverse(t->rchild)) return OK;return ERROR;}else return OK;}//preordertraverseint inordertraverse(BiTree &t){ //中序遍历if(t){if(inordertraverse(t->lchild))if(visit(t))if(inordertraverse(t->rchild)) return OK;return ERROR;}else return OK;}//inordertraverseint postordertraverse(BiTree &t){ //后序遍历if(t){ if(postordertraverse(t->lchild))if(postordertraverse(t->rchild))if(visit(t)) return OK;return ERROR;}else return OK;}//postordertraverseint menuselect(){//菜单选择程序int n;printf("*********************************************\n");printf("* 欢迎进入二叉排序树相关操作演示系统! *\n");printf("* *\n");printf("* 您可进行的操作有: *\n");printf("* 1.建树操作; *\n"); printf("* 2.查找操作; *\n");printf("*3.二叉排序树的遍历(a.先序遍历;b.中序遍历;c.后序遍历);*\n");printf("* 4.二叉树的插入操作; *\n");printf("* 5.二叉树的删除操作; *\n");printf("* 6.退出系统; *\n");printf("* *\n");printf("**************************************8******\n");printf("请输入操作代码:\n");scanf("%d",&n);if(n<=6&&n>=1)return n;else return ERROR;}//menuselectint main(){//主程序显示操作界面 实现各功能调用TArglist L; //数据声明int i=0,k=0,n=0;char q='a';TRcdType r,s;L=(TArglist)malloc(sizeof(Arglist)); //初始化数据表LL->length=0;for(i;i<=MAXSIZE;i++) L->r[i].key=L->r[i].data=0;createbitree(root); //建空树root p f gcreatebitree(p);createbitree(f);r=s=(TRcdType)malloc(sizeof(RcdType)); //初始化r sif(!r||!s)printf("数据初始化出错!\n");else r->data=r->key=s->data=s->key=0;for(;n=6;){switch(menuselect()){case 1:scanarg(L); //输入数据表creatBiTree(root,L); //创建二叉排序树printf("\n");break;case 2:printf("请输入要查找的数据的关键字:\n");scanf("%d",&k);if(!SearchBST(root,k,f,p))printf("未找到指定的元素!\n"); //查找printf("\n");break;case 3:{printf("请输入要进行的遍历类型代码(回到上一级菜单请输入‘e’!):\n");scanf("%s",&q);switch(q){case 'a':printf("则先序遍历二叉排序树的结果为(关键字 数据):\n");preordertraverse(root);printf("\n");break;case 'b':printf("则中序遍历二叉排序树的结果为(关键字 数据):\n");inordertraverse(root);printf("\n");break;case 'c':printf("则后序遍历二叉排序树的结果为(关键字 数据):\n");postordertraverse(root);printf("\n");break;case 'e':break;default:printf("操作代码输入错误!请输入“a”“b”“c”中的一个代码。\n");printf("\n");break;} break;}case 4:printf("请输入要插入的数据(关键字 数据):\n");scanf("%d %d",&r->key,&r->data);InsertBST(root,r,f,p); //插入二叉排序树中没有的元素printf("\n");break;case 5:printf("请输入要删除的数据(关键字 数据):\n");scanf("%d %d",&s->key,&s->data); //删除二叉排序树中已有的指定元素if(DeleteBST(root,s->key))printf("指定元素已删除!\n");printf("\n");break;case 6:printf("已成功退出系统!\n");break;default:printf("操作代码输入错误!请重新输入!(请输入“1”“2”“3”“4”“5 ”“6””中的一个操作代码。)\n");}}}
0 0
- 数据结构之排序二叉树操作
- TreeMap数据结构之排序二叉树
- 数据结构之 排序二叉树总结
- C++数据结构之二叉树递归操作
- [iuud8]数据结构算法之二叉树操作
- 数据结构之二叉树的基本操作
- 数据结构之二叉树递归操作
- 数据结构C语言版之二叉树操作
- 数据结构之二叉树的简单操作
- 数据结构-排序二叉树
- 【数据结构基础】二叉搜索(排序)树的基本操作
- 数据结构-二叉树操作
- 二叉树操作--数据结构
- 数据结构二叉树操作
- 数据结构二叉树操作
- 数据结构之二叉搜索树(排序树)HDU 3791
- 6. 数据结构进阶六之二叉树排序树
- 菜鸟学习数据结构之用堆排序理解二叉树
- PHP和MySQL Web开发(三)
- react native编译需要android ndk版本问题
- Linux系统swappiness参数在内存与交换分区之间优化作用
- 第十四周项目2---二叉树排序树中查找的路径
- 蓝桥杯: 打印十字型
- 数据结构之排序二叉树操作
- CSS——我的第一个网站
- [数学 几何] 51Nod 1512 向量翻转 & Codeforces #79 (Div. 1 Only) 101C Vectors
- matlab虚拟现实之vrbuild2模型导入
- docker 快速架设lnmp
- codeforces 2A winner(stl应用,模拟)
- 2016冬季练习
- AliCrackme_1.apk破解分析
- 前台将实体对象以json串形式传到后台并解析