首页

文章

用顺序和二叉链表作存储结构

发布网友 发布时间:2022-03-22 15:44

我来回答

1个回答

热心网友 时间:2022-03-22 17:13

代码给你吧。功能比你要求的还要多。
如果不想要多了的功能,你应该自己会改吧,删掉点代码就行了。
VC下通过。
#include<stdio.h>
#include<stdlib.h>

typedef struct Tnode{
int data; /*输入的数据*/
struct Tnode *lchild,*rchild; /*结点的左右指针,分别指向结点的左右孩子*/
}*node,BSTnode;
searchBST(node t,int key,node f,node *p) /*查找函数*/
{
if(!t) {*p=f;return (0);} /*查找不成功*/
else if(key==t->data) {*p=t;return (1);} /*查找成功*/
else if(key<t->data) searchBST(t->lchild,key,t,p); /*在左子树中继续查找*/
else searchBST(t->rchild,key,t,p); /*在右子树中继续查找*/
}

insertBST(node *t,int key) /*插入函数*/
{
node p=NULL,s=NULL;

if(!searchBST(*t,key,NULL,&p)) /*查找不成功*/
{
s=(node)malloc(sizeof(BSTnode));
s->data=key;
s->lchild=s->rchild=NULL;
if(!p) *t=s; /*被插结点*s为新的根结点*/
else if(key<p->data) p->lchild=s;/*被插结点*s为左孩子*/
else p->rchild=s; /*被插结点*s为右孩子*/
return (1);
}
else return (0);/*树中已有关键字相同的结点,不再插入*/
}

inorderTraverse(node *t) /*中序遍历函数*/
{
if(*t){
if(inorderTraverse(&(*t)->lchild)) /*中序遍历根的左子树*/
printf("%d ",(*t)->data); /*输出根结点*/
if(inorderTraverse(&(*t)->rchild)); /*中序遍历根的右子树*/
}
return(1) ;
}

calculateASL(node *t,int *s,int *j,int i) /*计算平均查找长度*/
{
if(*t){
i++; /*i记录当前结点的在当前树中的深度*/
*s=*s+i; /*s记录已遍历过的点的深度之和*/
if(calculateASL(&(*t)->lchild,s,j,i))/*计算左子树的ASL*/
{
(*j)++; /*j记录树中结点的数目*/
if(calculateASL(&(*t)->rchild,s,j,i)) /*计算右子树的ASL*/
{i--; return(1);}
}
else return(1);
}
}
node Delete(node t,int key) /*删除函数*/
{
node p=t,q=NULL,s,f;
while(p!=NULL) /*查找要删除的点*/
{
if(p->data==key) break;
q=p;
if(p->data>key) p=p->lchild;
else p=p->rchild;
}
if(p==NULL) return t; /*查找失败*/
if(p->lchild==NULL) /*p指向当前要删除的结点*/
{
if(q==NULL) t=p->rchild; /*q指向要删结点的父母*/
else if(q->lchild==p) q->lchild=p->rchild; /*p为q的左孩子*/
else q->rchild=p->rchild;/*p为q的右孩子*/
free(p);
}
else{ /*p的左孩子不为空*/
f=p;
s=p->lchild;
while(s->rchild) /*左拐后向右走到底*/
{
f=s;
s=s->rchild;
}
if(f==p) f->lchild=s->lchild; /*重接f的左子树*/
else f->rchild=s->lchild; /*重接f的右子树*/
p->data=s->data;
free (s);
}
return t;
}
int balanceBST(node t,int *i) /*判断是否为平衡二叉树的函数*/
{
int dep1,dep2;
if(!t) return(0);
else {
dep1=balanceBST(t->lchild,i);
dep2=balanceBST(t->rchild,i);
}
if((dep1-dep2)>1||(dep1-dep2)<-1) *i=dep1-dep2;/*用i值记录是否存在不平衡现象*/
if(dep1>dep2) return(dep1+1);
else return(dep2+1);
}
void main()
{
node T=NULL;
int num;
int s=0,j=0,i=0;
int ch=0;
node p=NULL;
printf("输入一串数,每个数以空格分开,最后一个数为0作结束:");
do{
scanf("%d",&num);
if(!num) printf("完成输入!\n");
else insertBST(&T,num);
}while(num);
printf("\n\n---主程序菜单---\n"); /*主程序菜单*/
printf("\n 0: 退出" );
printf("\n 1: 中序输出");
printf("\n 2: 树的平均查找长度ASL");
printf("\n 3: 删除元素");
printf("\n 4: 判断是否平衡树");
while(ch==ch)
{
printf("\n 选择一个功能以继续:");
scanf("%d",&ch);
switch(ch){
case 0: exit(0); /*0--退出*/
case 1: printf(" 中序遍历输出结果为:\n ");
inorderTraverse(&T); /*1--中序遍历*/
break;
case 2: s=0;j=0;i=0;
calculateASL(&T,&s,&j,i); /*2--计算平均查找长度*/
printf(" ASL=%d/%d",s,j);
break;
case 3: printf(" 输入一个数以删除结点:");
scanf("%d",&num); /*3--删除某个结点*/
if(searchBST(T,num,NULL,&p))
{
T=Delete(T,num);
printf(" 删除成功!\n ");
inorderTraverse(&T);
}
else printf(" 无%d",num);
break;
case 4: i=0;
balanceBST(T,&i); /*判断是否为平衡二插树*/
if(i==0) printf(" 是平衡树");
else printf(" 不是!");
break;
default: printf("因你的输入错误,请重新输入\n");
break; /*输入无效字符*/
}
}
}

附测试数据一组。
50 33 88 22 8 60 0
1
3
33
3
12
0
经测试正确。
逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 数据结构中,怎样以二叉链表为存储结构,分别写出求二叉树结点总数及叶子总数的算法? 二叉树的存储结构是怎样的?有哪些类型的存储结构?对应的c语言描述是? 二叉排序树。用二叉链表作存储结构。(8 三叉链表与二叉链表储存结构比较,有何区别?有何优缺点? 二叉链表作存储结构 二叉树的二叉链表存储结构如何实现 以二叉链表为存储结构, 二叉链表是二叉树的存储结构吗 您好,我的电话被标记骚扰电话了,怎么取消 电话号码被标注骚扰电话怎么解除 怎样取消号码诈骗电话标记 手机被标注骚扰电话,怎么解除? 手机被标注骚扰电话怎么取消? 手机被标记骚扰电话怎么取消 怎么取消标记电话 我的手机号不知道为什么被标记成诈骗电话了,怎么取消掉? 我的号码被标记为广告推销,骚扰电话,怎么取消标记 手机号码被标注为骚扰电话了,怎么解除掉 二叉树总的节点数为n,为啥空指针个数为n+1 二叉树指针问题。。Bitree 是什么? CreateBiTree为什么用BiTree *T, 是什么意思? 数据结构的两道题,以二叉链表为存储结构 设二叉排序树采用二叉链表存储结构 采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作 以二叉链表作为二叉树的储存结构,在具有n个结点的二叉链表中n(n>0),空链域的个数为() 若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用( )遍历方法最合适。 分别写出线性表的链式存储结构、二叉树的二叉链表存储机构的类C语言描述 以二叉链表为存储结构,写出求二叉树高度和宽度的算法 以二叉链表作存储结构,带虚节点的先序遍历序列为输入,构造二叉链表。 网络安全需要学什么 学习网络安全需要什么基础 如何学习网络安全知识? 网络安全怎么学? 网络安全需要学习哪些知识? 学习网络安全要学哪些知识? 学网络安全的基本知识有哪些? 网络安全工程师需要学习的必备技术有哪些? 如何学习网络安全,应该从何学起 网络安全需要哪些基础知识? 网络安全学些什么? 零基础如何学习网络安全方面的知识?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com