#include<stdio.h> #include<stdlib.h> typedef int KeyType; typedef struct node{ KeyType key; struct node*lchild,*rchild; }BSTNode,*BSTree; void InsertBST(BSTree*bst,KeyType key){ BSTree s;//?????????????????怎么不一样 if(*bst==NULL){ s=(BSTree)malloc(sizeof(BSTNode)); s->key=key; s->lchild=NULL; s->rchild=NULL; *bst=s; return; } else if(key<(*bst)->key) InsertBST(&((*bst)->lchild),key); else if(key>(*bst)->key) InsertBST(&((*bst)->rchild),key); } void CreateBST(BSTree*bst){ KeyType key; *bst=NULL; scanf("%d",&key); while(key!=0){ InsertBST(bst,key); scanf("%d",&key); } } BSTree DelBST(BSTree t,KeyType k){ BSTNode *p,*f,*s,*q; p=t;f=NULL; while(p){ if(p->key==k)break; f=p; if(p->key>k)p=p->lchild; else p=p->rchild; } if(p==NULL)return t; if(p->lchild==NULL){ if(f==NULL)t=p->rchild; else if(f->lchild==p)f->lchild=p->rchild; else f->rchild=p->rchild; free(p); } else{ q=p;s=p->lchild; while(s->rchild) {q=s;s=s->rchild; }if(q==p)q->lchild=s->lchild; else q->rchild=s->lchild; p->key=s->key; free(s); } return t; } int layer(BSTree bst,int k,int lay){ if(bst){ if(bst->key==k)return lay; if(bst->key>k){ lay++; return layer(bst->rchild,k,lay); } if(bst->key<k){ lay++; return layer(bst->lchild,k,lay); } } } void preOrder(BSTree bst){ if(bst!=NULL){ printf("%d ",bst->key); preOrder(bst->lchild); preOrder(bst->rchild); } if(bst==NULL)printf("# "); } void InOrder(BSTree bst){ if(bst!=NULL){ InOrder(bst->lchild); printf("%d ",bst->key); InOrder(bst->rchild); } } int main(){ BSTree bst; CreateBST(&bst); preOrder(bst); int key; scanf("%d",&key); bst=DelBST(bst,key); InOrder(bst); int n,lay=1; scanf("%d",&n); printf("%d",layer(bst,n,lay)); return 0; }为什么层数始终是0?怎么改

时间: 2024-02-25 10:57:28 浏览: 17
在函数`layer`中,当`bst->key>k`时,应该调用`layer(bst->lchild,k,lay)`,而不是`layer(bst->rchild,k,lay)`,因为左子树的值比根节点的值小,而右子树的值比根节点的值大。 因此,修改后的`layer`函数应该是这样的: ```c++ int layer(BSTree bst, int k, int lay) { if (bst) { if (bst->key == k) return lay; if (bst->key > k) { lay++; return layer(bst->lchild, k, lay); // 这里应该是左子树 } if (bst->key < k) { lay++; return layer(bst->rchild, k, lay); // 这里应该是右子树 } } return -1; } ``` 修改后的代码应该就可以正确地输出层数了。
相关问题

#include<stdio.h> #include<assert.h> #include<string.h> #include<errno.h> #include<stdlib.h> typedef int KeyType; typedef char InfoType; typedef struct node { KeyType key; InfoType data; struct node*lchild,*rchild; }BSTNode; BSTNode *insertbst(BSTNode*&bt,KeyType k) { if(bt==NULL) { bt=(BSTNode*)malloc(sizeof(BSTNode)); bt->key=k;bt->lchild=bt->rchild=NULL; } else if(k<bt->key) bt->lchild=insertbst(bt->lchild,k); else if(k>bt->key) bt->rchild=insertbst(bt->rchild,k); return bt; } BSTNode*createbst(KeyType a[],int n) { BSTNode*bt=NULL; int i=0; while(i<n) { bt=insertbst(bt,a[i]); i++; } return bt; } BSTNode *searchbst(BSTNode*bt,KeyType k) { BSTNode *p=bt; while(p!=NULL) { if(p->key==k)break; else if(p->key<k) p=p->lchild; else p=p->rchild; } return p; } void dispbst(BSTNode*bt) { if(bt!=NULL) { printf("%d",bt->key); if(bt->lchild!=NULL||bt->rchild!=NULL) { printf("("); dispbst(bt->lchild); if(bt->rchild!=NULL) printf(","); dispbst(bt->rchild); printf(")"); } } } int main() { BSTNode *bt,q; KeyType k=6; int a[]={4,9,0,1,8,6,3,5,2,7}; int n=10; bt=createbst(a,n); printf("输出这棵树"); dispbst(bt); printf("\n要查找的关键字为:%d",k); q=searchbst(bt,k); if((q!=NULL) { printf("输出关键字6所在的位置:%d\n",q); } else { printf("\n关键字6的元素不在表中\n"); } return 1; }这段代码有错误,请问错误在哪里,输出正确的代码

这段代码有几处错误: 1. 在函数`searchbst`中,当找到目标节点时应该退出循环,但是代码中没有添加`break`语句 2. 在函数`searchbst`中,当输入的二叉搜索树为空时,应该直接返回`NULL`,但是代码中没有添加该判断 3. 在函数`main`中,变量`q`应该是一个指向`BSTNode`类型的指针,而不是`BSTNode`类型 4. 在函数`main`中,`printf`语句中输出`q`时应该输出`q->key`,而不是`q` 下面是修改后的代码: ``` #include<stdio.h> #include<assert.h> #include<string.h> #include<errno.h> #include<stdlib.h> typedef int KeyType; typedef char InfoType; typedef struct node { KeyType key; InfoType data; struct node *lchild, *rchild; } BSTNode; BSTNode *insertbst(BSTNode *&bt, KeyType k) { if(bt == NULL) { bt = (BSTNode *)malloc(sizeof(BSTNode)); bt->key = k; bt->lchild = bt->rchild = NULL; } else if(k < bt->key) bt->lchild = insertbst(bt->lchild, k); else if(k > bt->key) bt->rchild = insertbst(bt->rchild, k); return bt; } BSTNode *createbst(KeyType a[], int n) { BSTNode *bt = NULL; int i = 0; while(i < n) { bt = insertbst(bt, a[i]); i++; } return bt; } BSTNode *searchbst(BSTNode *bt, KeyType k) { BSTNode *p = bt; while(p != NULL) { if(p->key == k) break; else if(p->key < k) p = p->rchild; else p = p->lchild; } return p; } void dispbst(BSTNode *bt) { if(bt != NULL) { printf("%d",bt->key); if(bt->lchild != NULL || bt->rchild != NULL) { printf("("); dispbst(bt->lchild); if(bt->rchild != NULL) printf(","); dispbst(bt->rchild); printf(")"); } } } int main() { BSTNode *bt, *q; // 修改此行 KeyType k = 6; int a[] = {4, 9, 0, 1, 8, 6, 3, 5, 2, 7}; int n = 10; bt = createbst(a, n); printf("输出这棵树: "); dispbst(bt); printf("\n要查找的关键字为:%d\n", k); q = searchbst(bt, k); if(q != NULL) { printf("输出关键字6所在的位置:%d\n", q->key); // 修改此行 } else { printf("\n关键字6的元素不在表中\n"); } return 1; } ```

优化这段代码:#include<stdio.h> #include<assert.h> #include<string.h> #include<errno.h> #include<stdlib.h> typedef int KeyType; typedef char InfoType; typedef struct node { KeyType key; InfoType data; struct node*lchild,*rchild; }BSTNode; BSTNode *insertbst(BSTNode*&bt,KeyType k) { if(bt==NULL) { bt=(BSTNode*)malloc(sizeof(BSTNode)); bt->key=k;bt->lchild=bt->rchild=NULL; } else if(k<bt->key) bt->lchild=insertbst(bt->lchild,k); else if(k>bt->key) bt->rchild=insertbst(bt->rchild,k); return bt; } BSTNode*createbst(KeyType a[],int n) { BSTNode*bt=NULL; int i=0; while(i<n) { bt=insertbst(bt,a[i]); i++; } return bt; } BSTNode *searchbst(BSTNode*bt,KeyType k) { BSTNode *p=bt; while(p!=NULL) { if(p->key==k)break; else if(p->key<k) p=p->lchild; else p=p->rchild; } return p; } void dispbst(BSTNode*bt) { if(bt!=NULL) { printf("%d",bt->key); if(bt->lchild!=NULL||bt->rchild!=NULL) { printf("("); dispbst(bt->lchild); if(bt->rchild!=NULL) printf(","); dispbst(bt->rchild); printf(")"); } } } int main() { BSTNode *bt,q; KeyType k=6; int a[]={4,9,0,1,8,6,3,5,2,7}; int n=10; bt=createbst(a,n); printf("输出这棵树"); dispbst(bt); printf("\n要查找的关键字为:%d",k); q=searchbst(bt,k); if((q!=0) printf("输出关键字6所在的位置:%d\n",q); else printf("\n关键字6的元素不在表中\n"); return 1; }

以下是对代码的优化: 1. 将代码中的Keytype和InfoType定义提前到头文件中,以便在多个文件中使用。 2. 在insertbst函数中,使用了递归的方式实现插入,但是可以使用迭代的方式来实现,代码更加简洁。 3. 在createbst函数中,可以使用for循环替代while循环,代码更加简洁。 4. 在searchbst函数中,如果找到了目标节点,应该返回指向该节点的指针,否则应该返回NULL。 5. 在输出函数dispbst中,应该先输出左子树,再输出右子树。 优化后的代码如下: ```c #include <stdio.h> #include <stdlib.h> typedef int KeyType; typedef char InfoType; typedef struct node { KeyType key; InfoType data; struct node *lchild, *rchild; } BSTNode; BSTNode *insertbst(BSTNode *&bt, KeyType k) { BSTNode *p = bt, *prev = NULL; while (p != NULL) { prev = p; if (k < p->key) { p = p->lchild; } else if (k > p->key) { p = p->rchild; } else { return bt; } } p = (BSTNode *) malloc(sizeof(BSTNode)); p->key = k; p->lchild = p->rchild = NULL; if (prev == NULL) { bt = p; } else if (k < prev->key) { prev->lchild = p; } else { prev->rchild = p; } return bt; } BSTNode *createbst(KeyType a[], int n) { BSTNode *bt = NULL; for (int i = 0; i < n; i++) { insertbst(bt, a[i]); } return bt; } BSTNode *searchbst(BSTNode *bt, KeyType k) { BSTNode *p = bt; while (p != NULL && p->key != k) { if (k < p->key) { p = p->lchild; } else { p = p->rchild; } } return p; } void dispbst(BSTNode *bt) { if (bt != NULL) { printf("%d", bt->key); if (bt->lchild != NULL || bt->rchild != NULL) { printf("("); dispbst(bt->lchild); if (bt->rchild != NULL) { printf(","); } dispbst(bt->rchild); printf(")"); } } } int main() { BSTNode *bt, *q; KeyType k = 6; int a[] = {4, 9, 0, 1, 8, 6, 3, 5, 2, 7}; int n = 10; bt = createbst(a, n); printf("输出这棵树:"); dispbst(bt); printf("\n要查找的关键字为:%d", k); q = searchbst(bt, k); if (q != NULL) { printf("\n输出关键字6所在的位置:%d\n", q->key); } else { printf("\n关键字6的元素不在表中\n"); } return 1; } ``` 经过优化后,代码更加简洁易读,并且运行效率也有所提高。

相关推荐

解释一下这个代码//尾插 #include<stdio.h> #include<stdlib.h> typedef int ElementType; typedef struct node { ElementType data; struct node * next; }Node; Node *create_LinkList() { int data; Node *head,*a,*b; head=a=(Node *)malloc(sizeof(Node)); a->next=NULL; while(1) { scanf("%d",& data); if(data==12345)break; b=(Node*)malloc(sizeof(Node)); b->data=data; b->next=a->next; a->next=b;a=b; } return(head); } int main() { return 0; } /*头插 #include<stdio.h> #include<stdlib.h> typedef int ElementType; typedef struct node { ElementType data; struct node * next; }Node; Node *create_LinkList(void) { int data; Node *head,*p; head=(Node *)malloc(sizeof(Node)); head->next=NULL; while(1) { scanf("%d",&data); if(data==456) break; p=(Node*)malloc(sizeof(Node)); p->data=data; } } int main() { return 0; } */ //单链表的第I位插入元素 void insert_Node(Node*L,int loc,ElementType e) { Node *point=L; int j=0; while(point->next!=NULL&&j<loc-1) { point=point->next; j++; } if(point->next==NULL||j!=loc-1) printf("位置不合适"); Node *temp=(Node*)malloc(sizeof(Node)); temp->data=e; temp->next=point->next; point->next=temp; } //单链表的第I位删除元素 void delete_LinkList(Node*L,int i) { int j=0;Node*p,*q; p=L; while(p->next!=NULL&&j<i-1) { p=p->next; j++; } if (p->next==NULL||j!=i-1) printf("i的位置不合理\n"); else { q=p->next;p->next=q->next; free(q); } } //单链表的按值查询 Node *Locale_Node(Node*L,int key) { Node*p=L->next; while(p!=NULL&&p->data!=key) p=p->next; if(p->data==key) return p; else { printf("查找的结点不存在!\n"); return(NULL); } } //单链表的整表输出 void PrintfList(Node *L) { Node *p=L; while(p->next!=NULL) { printf(" %d",p->next->data); p=p->next; } } //单链表的整表删除 void ClearList(Node *L) { Node *p,*q; p=L; while(p!=NULL) { q=p->next; free(p); p=q; } p->next=NULL; }

#define MAXSIZE 100 typedef int KeyType; /*关键字类型*/ typedef struct { KeyType key; /*InfoType otherinfo;*/ }RedType; /*记录类型*/ typedef struct BiTNode { RedType data; struct BiTNode *lchild,*rchild; }BiTNode, *BiTree; /*动态查找表的二叉链表存储表示*/#include <stdio.h> #include <stdlib.h> #include <string.h> #include "search.h" BiTree Search_BST(BiTree T, KeyType key, BiTNode **parent) {/*在二叉排序树T上查找其关键字等于key的记录结点。若找到返回该结点指针,parent指向其双亲;否则返回空指针,parent指向访问路径上最后一个结点。*/ // 请在这里补充代码,完成本关任务 /********** Begin *********/ /********** End **********/ } void Insert_BST(BiTree *T, RedType r)/*若二叉排序树T中没有关键字为r.key的记录,则插入*/ { BiTNode *p,*q,*parent; parent=NULL; p=Search_BST(*T,r.key,&parent); /*查找*/ if(p) printf("BST中有结点r,无需插入\n"); else { p=parent; q=(BiTNode *)malloc(sizeof(BiTNode)); q->data=r; q->lchild=q->rchild=NULL; if(*T==NULL) *T=q; /*若T为空,则q为新的根*/ else if(r.keydata.key) p->lchild=q; else p->rchild=q; } } BiTree Create_BST( ) /*二叉排序树的构造*/ {/*输入若干记录的关键字(以-1标志结束),生成一棵BST,采用二叉链表存储,返回其根指针T*/ BiTree T; RedType r; T=NULL; /*建空树*/ scanf("%d",&r.key); while(r.key!=-1) { Insert_BST(&T, r); scanf("%d",&r.key); } return T; } void PreOrder(BiTree bt) /*先序遍历*/ { if(bt) { printf("%d ",bt->data.key); PreOrder(bt->lchild); PreOrder(bt->rchild); } } void InOrder(BiTree bt) /*中序遍历*/ { if(bt) { InOrder(bt->lchild); printf("%d ",bt->data.key); InOrder(bt->rchild); } 补充代码

最新推荐

recommend-type

VB学生档案管理系统设计与实现.rar

计算机专业毕业设计VB精品论文资源
recommend-type

debugpy-1.6.3-cp37-cp37m-win_amd64.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、
recommend-type

命名ACL和拓展ACL标准ACL的具体区别

命名ACL和标准ACL的主要区别在于匹配条件和作用范围。命名ACL可以基于协议、端口和其他条件进行匹配,并可以应用到接口、VLAN和其他范围。而标准ACL只能基于源地址进行匹配,并只能应用到接口。拓展ACL则可以基于源地址、目的地址、协议、端口和其他条件进行匹配,并可以应用到接口、VLAN和其他范围。