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); } } }为什么输出0
时间: 2024-02-25 09:57:26 浏览: 67
这段代码中没有设置bst为NULL时的返回值,导致当搜索不到关键字k时,没有返回任何值,因此输出为0,可以修改代码如下:
```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->rchild,k,lay);
}
if(bst->key<k){
lay++;
return layer(bst->lchild,k,lay);
}
}
return -1; // 如果找不到k,返回-1
}
```
这里我添加了一个返回值为-1的语句作为找不到关键字k时的返回值,你可以根据实际情况修改。
相关问题
#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?怎么改
在函数`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 <string.h> #include <malloc.h> #define ENDKEY -1 typedef struct node { int key; struct node *lchild, *rchild; } BSTNode, *BSTree; // 二叉排序树插入 void InsertBST(BSTree *bst, int key) { BSTree s, p, q; s = (BSTree)malloc(sizeof(BSTNode)); s->key = key; s->lchild = s->rchild = NULL; if (*bst == NULL) { *bst = s; } else { p = *bst; while (p != NULL) { q = p; if (key < p->key) { p = p->lchild; } else { p = p->rchild; } } if (key < q->key) { q->lchild = s; } else { q->rchild = s; } } } // 创建二叉排序树 void CreatBST(BSTree *bst) { int key; *bst = NULL; scanf("%d", &key); while (key != ENDKEY) { InsertBST(bst, key); scanf("%d", &key); } } // 中序遍历二叉树 void InOrder(BSTree bst) { if (bst != NULL) { InOrder(bst->lchild); printf("%d ", bst->key); InOrder(bst->rchild); } } int main() { BSTree bst; CreatBST(&bst); InOrder(bst); return 0; }改正该代码的错误之处
该代码没有明确指出错误的具体位置,以下是我发现的可能的错误和对应的解决方法:
1. 在 `InsertBST` 函数中,没有处理当插入节点的键值与已有节点的键值相同时的情况。解决方法是,在遍历搜索树时,如果找到了一个键值与插入节点相同的节点,则不插入新节点,直接返回。
2. 在 `CreatBST` 函数中,使用了一个未定义的宏 `ENDKEY`。解决方法是,在程序开头定义宏 `ENDKEY`,例如 `#define ENDKEY -1`。
3. 在 `main` 函数中,没有检查动态内存分配是否成功。解决方法是,在调用 `malloc` 分配内存后,检查返回的指针是否为 NULL,如果是则说明分配失败,应该结束程序或进行相应的错误处理。
4. 在 `main` 函数中,没有释放动态分配的内存。解决方法是,在程序结束前,通过调用 `free` 函数释放动态分配的内存。
以下是修改后的代码:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ENDKEY -1
typedef struct node {
int key;
struct node *lchild, *rchild;
} BSTNode, *BSTree;
// 二叉排序树插入
void InsertBST(BSTree *bst, int key) {
BSTree s, p, q;
s = (BSTree)malloc(sizeof(BSTNode));
if (s == NULL) {
fprintf(stderr, "Error: failed to allocate memory\n");
exit(EXIT_FAILURE);
}
s->key = key;
s->lchild = s->rchild = NULL;
if (*bst == NULL) {
*bst = s;
} else {
p = *bst;
while (p != NULL) {
q = p;
if (key < p->key) {
p = p->lchild;
} else if (key > p->key) {
p = p->rchild;
} else {
free(s); // 释放已分配的节点内存
return; // 不插入新节点
}
}
if (key < q->key) {
q->lchild = s;
} else {
q->rchild = s;
}
}
}
// 创建二叉排序树
void CreatBST(BSTree *bst) {
int key;
*bst = NULL;
scanf("%d", &key);
while (key != ENDKEY) {
InsertBST(bst, key);
scanf("%d", &key);
}
}
// 中序遍历二叉树
void InOrder(BSTree bst) {
if (bst != NULL) {
InOrder(bst->lchild);
printf("%d ", bst->key);
InOrder(bst->rchild);
}
}
int main() {
BSTree bst;
CreatBST(&bst);
InOrder(bst);
free(bst); // 释放二叉树的内存
return 0;
}
```
阅读全文