问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

急!高分悬赏!求c语言高手!!!二叉树输入中如何判断输入是否合法?

发布网友 发布时间:2022-04-30 03:40

我来回答

2个回答

热心网友 时间:2023-11-01 01:23

树实现一个动态查找表,实现动态查找表的三种基本功能:查找、插入和删除。
2. 初始,平衡二叉树为空树,可以按先序输入平衡二叉树,以输入0结束,中间以回车隔开,创建好二叉树后,可以对其查找,再对其插入,输入0结束插入,再可以对其删除,输入0结束,每次插入或删除一个结点后,更新平衡二叉树的显示。
3. 本程序以用户和计算机的对话方式执行,根据计算机终端显示:“提示信息”下,用户可由键盘输入要执行的操作。
4. 测试数据(附后)
二、 概要设计
1. 抽象数据类型动态查找表的定义如下:
ADT DynamicSearchTable{
数据结构D:D是具有相同特性的数据元素的集合。各个数据元素含有类型相同,可惟一标识数据元素的关键字。
数据关系R:数据元素同属一个集合。
基本操作P:
InitDSTable(&DT);
操作结果:构造一个空的动态查找表DT。
DestroyDSTable(&DT);
初试条件:动态查找表DT存在。
操作结果: 销毁动态查找表DT。
SearchDSTable(DT,key);
初试条件:动态查找表DT存在,key为和关键字类型相同的给定值。
操作结果: 若DT中存在其关键字等于key的数据元素,则函数值为该元素的值或表中的位置,否则为“空”。
InsertDSTable(&DT,e);
初试条件:动态查找表DT存在,e为待插入的数据元素。
操作结果: 若DT中不存在其关键字等于e. key的数据元素,则插入e到DT。
DeleteDSTable(&DT,key);
初试条件:动态查找表DT存在,key为和关键字类型相同的给定值。
操作结果: 若DT中存在其关键字等于key的数据元素,则删除之。
TraverseDSTable(DT,Visit());
初试条件:动态查找表DT存在,Visit()是结点操作的应用函数。
操作结果: 按某种次序对DT的每个结点调用函数Visit()一次且至多
一次。一但Visit()失败,则操作失败。
}ADT DynamicSearchTable

2. 本程序包含两个模块:
Void main(){
Do{
接受命令(根据提示输入终点城市和起点城市的序号);
处理命令;
}while(“命令”=“退出”);
}

3.本程序只有两个模块,调用关系简单
主程序模块

平衡二叉树的模块

三、 详细设计

1. 根据题目要求和查找的基本特点,其结点类型
typedef struct BSTnode{
int data;
int bf;
struct BSTnode *lchild,*rchild;
}BSTnode,*bstree;

#define LH +1
#define EH 0
#define RH -1

/-----------------------------************对平衡二叉树的操作
bstree InsertAVL(bstree &T, int e);
////////在平衡二叉树中插入结点。
int FindAVL(bstree p,int e);
////////查找平衡二叉树中是否有结点e。
bstree DeleteAVL(bstree &T,int e)
////////删除平衡平衡二叉树的结点e,并保持平衡二叉树的性质。
int Preordertraverse(bstree T)
////////按先序遍历平衡二叉树。

/------------------------************平衡二叉树的操作的详细算法
bstree InsertAVL(bstree &T, int e)
{
bstree p;
//插入新结点,树长高置taller为TRUE
if(!T) {
T=(bstree)malloc(sizeof(BSTnode));
T->data=e;
T->lchild=T->rchild=NULL;
T->bf=EH;
taller=TRUE;
}
else {
//树中存在和e有相同关键字的结点则不再插入
if(e==T->data){
taller=FALSE;
return NULL;
}

//值小于则继续在树的左子树中搜索
if(e < T->data){
//插入到左子树且左子树长高
p=InsertAVL(T->lchild,e);
if(p){
T->lchild=p;
if(taller) {
switch(T->bf){ //检查*T的平衡度
case LH: //原本左子树比右子树高,需要做左平衡处理
T=LeftBalance(T);
taller=FALSE;
break;
case EH: //原本左子树和右子树同高,现因左子树争高而使树增高
T->bf=LH;
taller=TRUE;
break;
case RH: //原本右子树比左子树高,现在左右子树等高
T->bf=EH;
taller=FALSE;
break;
}///////switch(T->bf)
}///////if(taller)
}/////if(p)
}///////if(e < T->data)
//继续在*T的右子树中搜索
else{
//插入到右子树且使右子树长高
p=InsertAVL(T->rchild,e);
if (p){
T->rchild=p;
if(taller) {
switch(T->bf){ //检查*T的平衡度
case LH: //原本左子树比右子树高,现在左右子树等高
T->bf=EH;
taller=FALSE;
break;
case EH: //原本左子树和右子树同高,现因右子树增高而使树增高
T->bf=RH;
taller=TRUE;
break;
case RH: //原本右子树比左子树高,需要做右平衡处理
T=RightBalance(T);
taller=FALSE;
break;
}//////switch(T->bf)
}/////if(taller)
}/////if (p)
}//////if(e > T->data)
}///////else
return T;
}

int Preordertraverse(bstree T){
if(T){
printf(" %d %d\n",T->data,T->bf);
Preordertraverse(T->lchild);
Preordertraverse(T->rchild);
}
return 1;
}

int FindAVL(bstree p,int e){
if(p==NULL)return NULL;
else if(e==p->data) return true;
else if(e<p->data){
p=p->lchild;
return FindAVL(p, e);
}////左子树上查找
else {
p=p->rchild;
return FindAVL( p, e);
}////右子树上查找
}

bstree DeleteAVL(bstree &T,int e){
//删除后要保证该二叉树还是平衡的
int n,m=0;/////标记
bstree q;
if(!T)return NULL;
else {
if(e==T->data) {////直接删除
n=Delete(T,e);
m=n;
if(m!=0) {
q=T;
DeleteAVL(T,m);
q->data=m;}
}
else {
if(e<T->data){////在左子树上寻找
DeleteAVL(T->lchild,e);
if(shorter){
switch(T->bf){
case LH:T->bf=EH;shorter=true;break;
case EH:T->bf=RH;shorter=false;break;
case RH:Delete_Rightbalance(T);shorter=true;break;
}////switch(T->bf)
}/////if(shorter)
}/////if(e<T->data)
else{ /////////在右子树上寻找
DeleteAVL(T->rchild,e);
if(shorter)
switch(T->bf){
case LH:Delete_Leftbalance(T);shorter=true;break;
case EH:T->bf=LH;shorter=false;break;
case RH:T->bf=EH;shorter=true;break;
}////////switch(T->bf)
}////////在右子数上寻找完
}////////在左右子上完
}///////////删除完
return T;
}

2. 主程序和其他伪码算法
void main(){
while(e!=0){
if(e!=0) InsertAVL(T,e);
}
while(d!=0){
if(d!=0) InsertAVL(T,d);
Preordertraverse(T);
}
c=FindAVL(T,t);
if(c==1)printf("有要查找的节点\n");
else printf("无要查找的节点\n");
do{
DeleteAVL(T,b);
Preordertraverse(T);
}while(b==1);
}

///右旋
bstree R_Rotate(bstree &p){
bstree lc;
lc=p->lchild;
p->lchild=lc->rchild;
lc->rchild=p;
p=lc;
return p;
}

////左旋
bstree L_Rotate(bstree &p){
bstree rc;
rc=p->rchild;
p->rchild=rc->lchild;
rc->lchild=p;
p=rc;
return p;
}

/////左平衡处理
bstree LeftBalance(bstree &T){
bstree lc,rd;
lc=T->lchild; //lc指向*T的左子树根结点
switch(lc->bf) { //检查*T的左子树平衡度,并做相应的平衡处理
case LH: //新结点插入在*T的左孩子的左子树上,要做单右旋处理
T->bf=lc->bf=EH;
T=R_Rotate(T);
break;
case RH: //新结点插入在*T的左孩子的右子树上,要做双旋处理
rd=lc->rchild; //rd指向*T的左孩子的右子树根
switch(rd->bf){ //修改*T及其左孩子的平衡因子
case LH:
T->bf=RH;
lc->bf=EH;
break;
case EH:
T->bf=lc->bf=EH;
break;
case RH:
T->bf=EH;
lc->bf=LH;
break;
}//////////switch(rd->bf)
rd->bf=EH;
T->lchild=L_Rotate(T->lchild); //对*T的左孩子做左旋平衡处理
T=R_Rotate(T); //对*T做右旋处理
}////////switch(lc->bf)
return T;
}

////右平衡处理
bstree RightBalance(bstree &T)
{
bstree rc,ld;
rc=T->rchild; //rc指向*T的右子树根结点
switch(rc->bf) { //检查*T的右子树平衡度,并做相应的平衡处理
case RH: //新结点插入在*T的右孩子的右子树上,要做单右旋处理
T->bf=rc->bf=EH;
T=L_Rotate(T);
break;
case LH: //新结点插入在*T的右孩子的左子树上,要做双旋处理
ld=rc->lchild; //ld指向*T的右孩子的左子树根
switch(ld->bf){ //修改*T及其右孩子的平衡因子
case LH:
T->bf=EH;
rc->bf=RH;
break;
case EH:
T->bf=rc->bf=EH;
break;
case RH:
T->bf=LH;
rc->bf=EH;
break;
}///switch(ld->bf)
ld->bf=EH;
T->rchild=R_Rotate(T->rchild); //对*T的右孩子做右旋平衡处理
T=L_Rotate(T); //对*T做左旋处理
}/////switch(rc->bf)
return T;
}

int Delete(bstree &T,int e){
//删除结点
bstree p,q;
e=0;
p=T;
if(!T->rchild) {//右子数为空需要重接它的左子数
T=T->lchild;
free(p);
shorter=true;
}
else if(!T->lchild) {//重接它的右子数
T=T->rchild;
free(p);
shorter=true;
}
else{ //左右子数均不空
q=T->lchild;
while(q->rchild!=NULL){//转左,然后向右到尽头
q=q->rchild;
}
e=q->data;
}
return e;
}

void Delete_Rightbalance(bstree &T){
///////////删除在左子树上的,相当于插入在右子树
bstree rc=T->rchild,ld;
switch(rc->bf){
case LH://///////双旋 ,先右旋后左旋
ld=rc->lchild;
rc->lchild=ld->rchild;
ld->rchild=rc;
T->rchild=rc->lchild;
rc->lchild=T;
switch(ld->bf) {
case LH:T->bf=EH;
rc->bf=RH;
break;
case EH:T->bf=rc->bf=EH;
break;
case RH:T->bf=LH;
rc->bf=EH;
break;
}
ld->bf=EH;
T=rc;
shorter=true;break;
case EH:///////删除在左子树,相当于插入在右子树,左单旋
T->rchild=rc->lchild;
rc->lchild=T;
rc->bf=LH;
T->bf=RH;
T=rc;
shorter=EH;break;
case RH:///////删除在左子树,相当于插入在右子树,左单旋
T->rchild=rc->lchild;
rc->lchild=T;
rc->bf=T->bf=EH;
T=rc;
shorter=true;break;
}
}

void Delete_Leftbalance(bstree &T)/////删除右子树上的,相当于插入在左子树上
{
bstree p1,p2;
p1=T->lchild;
switch(p1->bf) {
case LH:T->lchild=p1->rchild;//////右旋
p1->rchild=T;
p1->bf=T->bf=EH;
T=p1;
shorter=true;
break;
case EH:T->lchild=p1->rchild;///////右旋
p1->rchild=T;
p1->bf=RH;
T->bf=LH;
T=p1;
shorter=false;
break;
case RH:p2=p1->rchild;//////////右双旋
p1->rchild=p2->lchild;
p2->lchild=p1;
T->lchild=p2->rchild;
p2->rchild=T;
switch(p2->bf){
case LH:T->bf=RH;p1->bf=EH;break;
case EH:T->bf=EH;p1->bf=EH;break;
case RH:T->bf=EH;p1->bf=LH;break;
}
p2->bf=EH;
T=p2;
shorter=true;break;
}
}

3. 函数的调用关系图
Main

InsertAVL Preordertraverse FindAVL DeleteAVL

四、 调试分析
1. 在开始对平衡二叉树的插入后,再做平衡处理时,特别是在做双向旋转平衡处理后的更新时,费了一些时间;
2. 在做平衡二叉树的删除时,当删除结点左右孩子均在时,开始直接用左子树的最大数代替,然后直接删除结点,结果导致删除了将要删除的结点及其孩子均删除了,后来将要删除的结点用左子树的最大树代替后,对左子树的最大结点做好标记,然后再做对其做删除处理。
3. 本程序算法基本简单,没有多大困难,就是在分析做双旋平衡处理的更新时,开始思路有些混乱,后来就好了;

五、 用户手册
1. 本程序的运行环境为DOS操作系统,执行文件为Balanced Tree.exe。
2. 进入演示程序后,按广度遍历输入平衡二叉树,中间以回车键隔开,输入0为结束;再输入要插入的结点,输入0结束,再输入要查找的结点,最后可以输入要删除的结点,输入0结束
六、 测试结果
先按广度遍历创建平衡二叉树(亦可一个一个的插入二叉树的结点)(50 20 60 10 30 55 70 5 15 25 58 90) ,输入0结束,然后可插入结点(39),其会显示插入后的二叉树,输入0,不再插入;输入要查找结点(6),输入要删除的结点(20),其显示如下:
/*****自己做完截图放在这里*****/
七、 附录
Balance Tree.cpp

有两个分号是中文的,还有头文件自己加,其他没有问题
另外,站长团上有产品团购,便宜有保证

热心网友 时间:2023-11-01 01:23

设置一个char a[]来保存输入的Input
然后遍历数组a[],直到strlen
根据a[]里面的字符进行判断.
如果第一个是0,则检测是否后面有不是0的字符,如果有,就是invalid
如果第一个不是0,检测第二个,如果第二个为0,检测第三个,如果第三个不为0,输出invalid
如果第一个不是0,检测第二个,如果第二个不为0,检测第三个等等,不断循环
急!高分悬赏!求c语言高手!!!二叉树输入中如何判断输入是否合法?_百度...

2. 进入演示程序后,按广度遍历输入平衡二叉树,中间以回车键隔开,输入0为结束;再输入要插入的结点,输入0结束,再输入要查找的结点,最后可以输入要删除的结点,输入0结束 六、 测试结果 先按广度遍历创建平衡二叉树(亦可一个一个的插入二叉树的结点)(50 20 60 10 30 55 70 5 15 25 58 90) ,输入0结束,然后...

高分悬赏!!数据结构问题。判定二叉树等。

1. 对这个树遍历的同时进行两项检查 a. 每个结点有0个或2个子结点 b. 如果有2个子节点 则子结点的值之和等于该结点的值 2. 可以考虑BFS算法的变种应用 从某结点开始 应用BFS算法 只是这次不再对每个结点进行“以访问”标记 而是在每个结点里记录该结点的祖先信息(就是父结点 爷爷结点等等) ...

十万火急!!!求C语言的精英帮忙,高分悬赏!!!

1. #include &lt;iostream&gt;int max(int a, int b){ if(a&gt;=b) return a; else return b;}int main(void){ int a,b; scanf("%d%d", &amp;a, &amp;b); cout&lt;&lt;"the max is: "&lt;&lt;max(a,b)&lt;&lt;endl; return 0;}2. #include &lt;iostream&gt;int main(void){ int n...

高分悬赏——帮忙看看程序问题

p=CreateBiTree(&amp;root);/*传入根结点指针的地址在函数中指向二叉树根*/ INORDER(p);depth(p);LeafCount_BiTree(p);} 测试通过:运行结果为:// 这里输入时按照你的abc##de#g##f### ,注意空格的输入 / please input the treestring you want create :abc de g f c b e ...

c语言高手请进!200高分悬赏!

int main(void){ int a,b,s;char d;printf("enter a number:");scanf("%d",&amp;a);getchar(); /*过滤掉scanf留下的'\n'否则会直接跳过下次输入*/ printf("enter an d:");scanf("%c",&amp;d);getchar();/*跟上一次的getchar功能一样*/ do{ printf("enter a number:");scanf("%d"...

C语言大神帮帮我啊!!帮帮忙,我悬赏高分帮帮忙!!在线等待

long count=0;void Swap(int &amp;a,int &amp;b){ int temp=a;a=b;b=temp;} void Perm(int list[],int k,int m)//k表示前缀的位置,m是要排列的数目.{ if(k==m-1)//前缀是最后一个位置,此时打印排列数.{ int tag=0;for(int i=0;i&lt;m;i++){ if(list[i]==i+1){ tag=1;brea...

高分悬赏!急!急!急!小女子有难,哪位C语言高手帮忙指点一下

typedef struct S_Student { char szName[12];char szID[19];}Student;int *GetAge(char *pID, int iCurYear){ static int iAge = 0;iAge = -1;if(pID == NULL) return NULL;char szYear[5];memset(szYear, 0, 5);memcpy(szYear, pID+6, 4); //截取年 iAge = iCurYear ...

高分悬赏C语言作业!!!急!!!

main(){ int m,g,c;//定义变量,男生数量为m,女生为g,小孩为c for (m=1;m&lt;36;m++)for (g=1;g&lt;36;g++)for (c=1;c&lt;36;c++)if ((m+g+c)==36&amp;&amp;(8*m+6*g+c)==72)// 满足人数为36,搬砖数量为36则输出 printf("男%d 女%d 小孩%d\n",m,g,c);return 0;} ...

简单C语言问题,高分悬赏!!!

cat *catN=(cat*)malloc(5*sizeof(cat)); //可以输入5只猫的信息 char *s=(char*)malloc(21*sizeof(char));for(int num=0;num&lt;5;num++){ //循环5次输入 printf("--- Type 'quit' in entering cat's name if you want to quit this program ---\n");printf("Input th...

高分求数据结构(C语言)高手做题!(200悬赏+50追加+20采纳=270分)_百度...

44.设一棵二叉树中没有度为1的结点,已知叶子结点数为n,此树的结点数为( B )。A)2n+2 B)2n+1 C)2n D)2n-1 45.设二叉树中有n2个度为2的结点,n1个度为1的结点,n0个叶子结点,则此二叉树中空指针域个数为( D )。A)n0+n1+n2 B)n2+n1+2n0 C)2n2+n1 ...

二叉树c语言实现 c语言建立二叉树 二叉树创建c语言实现 二叉树遍历 c语言 二叉树的遍历c语言代码 二叉树层次遍历c语言 c语言先序创建二叉树 c语言二叉树的创建与遍历 二叉树中序遍历
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
哪个手机卡流量多又便宜 四级成绩单选了电子版怎么办啊? 直播平台排名是什么样的? 春季养生男人喝什么茶可保肝护肾? 养肾护肾的最好方法食补 养肾护肾吃什么最好食疗 养肾护肾的最好方法食补 养肾护肾的最好方法食补 怀孕初期不能吃的食物列表 鹿鞭怎么泡酒 快来学学吧 验孕棒说明书 ?验孕棒多少天才可以验出来 验孕棒怎么用 关于可控硅的英语文献,最好翻译成中文!!!急用 邮政微邮付怎么添加店员收款通知? excel取消框线 怎么解开??? 数据库为什么要分库分表? 一些英语缩写 window.jQuery = window.$ = require(&#39;jquery-1.10.2.min.js&#39;);是什么意思啊 三年级下册燕子 尾尖偶尔沾了一下水面 里面的沾字和碰字的区别 病毒名称为:Worm.win32.Autorun.eyr是什么病毒?怎样杀死它?谢谢! 英语网上常用缩写的意思(1) 各种英文字母缩写的网络意思 Eyramsco是不是法国名?男名还是女名? 尿常规GLU++++EYR++++是什么意思 霑是什么? 直流电缆EYR什么意思 请问华为AGS2-WO9平板怎么隐藏应用(不用抽屉空间的前提下)? 为什么华为平板上就不可以隐藏游戏? 什么是资产负债率 给说点在家练习篮球技巧的方法 如何允许google 使用摄像头想问已经允许geogle使用摄像头了,而且系统上也允许了,摄像头也_百度问一问 用C++制作一个通讯录管理 求华为交换机6系列的配置手册 求高清《 彷徨的爱 》片源!!! 跪求《彷徨的爱(1996)》百度云高清资源在线观看,让娜·莫罗主演的 跪求法国二战爱情电影推荐,【在线观看】免费百度云资源 盘点法国二战爱情电影,【免费高清】在线观看百度网盘资源 跪求法国二战老电影大全,【免费高清】在线观看百度网盘资源 求一部 美国影片 (央视电影频道播放过)片名是:茫然的爱 跪求裘德·洛主演的电影,【免费高清】在线观看百度网盘资源 跪求裘德·洛电影,【免费高清】在线观看百度网盘资源 求Jude Law以前演的一部电影~ 电影里女主角叫Daisy 美国影片《彷徨的爱》讲的什么意思 想找一部电影,是裘德·洛Jude Law主演的。 求 裘德·劳 主演的所有电影 谢谢 【合集】裘德洛主演最好看的一部电影,【在线观看】免费百度云资源 国外爱情片,在CCTV6放过 跪求裘德洛电影,【免费高清】在线观看百度网盘资源 CCTV6播过哪几部裘德·洛的电影? 跪求裘德洛的经典电影,【在线观看】免费百度云资源 全球四大理工大学是哪四个