简单的搜索二叉树,哪里错了,帮忙找一下bug

KID6200 2020-01-20 01:26:31
#include<stdio.h> #include<stdlib.h> typedef struct TreeNode *BinTree; typedef BinTree Position; struct TreeNode { int data; BinTree left,right; }; BinTree insert(int x,BinTree BST) { if(!BST) { BST=(BinTree)malloc(sizeof(TreeNode)); BST->data=x; BST->left=BST->right=NULL; } if(x<BST->data) { insert(x,BST->left); } if(x>BST->data) { insert(x,BST->right); } return BST; } BinTree FindMin(BinTree BST) { while(!BST->left) BST=BST->left; return BST; } void PreOrderTraversal(BinTree BT) { if(BT) { printf("%d",BT->data); PreOrderTraversal(BT->left); PreOrderTraversal(BT->right); } } int main() { int val; BinTree BST; BST=(BinTree)malloc(sizeof(TreeNode)); scanf("%d",&val); BST->data=val; BST->left=BST->right=NULL; scanf("%d",&val); while(val!=0) { BST=insert(val,BST); scanf("%d",&val); } PreOrderTraversal(BST); }
...全文
827 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
luj_1768 2020-01-31
  • 打赏
  • 举报
回复
好像数据结构没设计好,不能用。BTree的数据结构是个难题,比如可以这样: struct bNode{ void* data; bNode* parent; bNode* brother; bNode* me; bool isRoot, isRight; private: unsigned long mapSeed; };
m0_46228505 2020-01-27
  • 打赏
  • 举报
回复
bkLion 2020-01-24
  • 打赏
  • 举报
回复
用电脑登录博客网站,点击导航上面的论坛,左边那里可以看到未结贴的帖子
bkLion 2020-01-24
  • 打赏
  • 举报
回复
没必要放这么多代码叭
好烦吃不胖 2020-01-21
  • 打赏
  • 举报
回复
asagsjhgajs 2020-01-21
  • 打赏
  • 举报
回复
学习学习 哈哈哈哈哈
qq703568206 2020-01-21
  • 打赏
  • 举报
回复
假如左右子树都空,那么也符合条件if(!BST->left)所以会BST=BST->left。而BST->left就是NULL。
KID6200 2020-01-20
  • 打赏
  • 举报
回复
引用 14 楼 寻开心的回复:
你没有所有路径都给tmp初值
比如, Delete传参NULL进来的时候会如何?
tmp没有初值,就free(tmp)了,这个时候就是野指针了
free(NULL)是可以的, free一个野指针就不可以
明白了,谢谢,我回去再结贴
寻开心 2020-01-20
  • 打赏
  • 举报
回复
你没有所有路径都给tmp初值
比如, Delete传参NULL进来的时候会如何?
tmp没有初值,就free(tmp)了,这个时候就是野指针了
free(NULL)是可以的, free一个野指针就不可以
KID6200 2020-01-20
  • 打赏
  • 举报
回复
引用 12 楼 寻开心的回复:
BinTree FindMin(BinTree BST)
{
while( BST->left)
BST=BST->left;
return BST;
}

这个部分代码也是要改的

你原来的代码,主要是tmp没有初始化为NULL, 改了之后,按照你的逻辑也是可以走通的
大神牛批。不过我不明白,虽然tmp原本是一个野指针,但是FindMin不是赋值给它了吗
寻开心 2020-01-20
  • 打赏
  • 举报
回复
BinTree FindMin(BinTree BST)
{
while( BST->left)
BST=BST->left;
return BST;
}

这个部分代码也是要改的

你原来的代码,主要是tmp没有初始化为NULL, 改了之后,按照你的逻辑也是可以走通的
KID6200 2020-01-20
  • 打赏
  • 举报
回复
上面一个left是right,打错了
KID6200 2020-01-20
  • 打赏
  • 举报
回复
假如左右子树都空,那么也符合条件if(!BST->left)所以会BST=BST->left。而BST->left就是NULL。所以最后左右结点都空的那段代码应该加不加都一样。我说的不是这里错误,而是运行起来删除操作做了一个就卡顿直接结束了,就是我还没输入第二个零他就卡了一下然后程序结束了(第一个零是插入结束)
寻开心 2020-01-20
  • 打赏
  • 举报
回复
BST是要删除的节点, 它的左右子树都是空, 那么这种情况就要删除BST返回NULL的啊
怎么不对了? 给出错误的例子呗
KID6200 2020-01-20
  • 打赏
  • 举报
回复
引用 7 楼 寻开心的回复:
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode
{
int data;
BinTree left,right;
};

BinTree insert(int x,BinTree BST)
{
if(!BST)
{
BST=(BinTree)malloc(sizeof(TreeNode));
BST->data=x;
BST->left=BST->right=NULL;
}
if(x<BST->data)
{
BST->left=insert(x,BST->left);
}
if(x>BST->data)
{
BST->right=insert(x,BST->right);
}
return BST;
}



BinTree FindMin(BinTree BST)
{
while(!BST->left)
BST=BST->left;
return BST;
}

BinTree Delete(int x,BinTree BST)
{
Position tmp=NULL;
if( !BST ) {
printf("查找失败!");
return NULL;
}
else if( x < BST->data)
BST->left = Delete(x,BST->left);
else if(x>BST->data)
BST->right=Delete(x,BST->right);
else {
tmp = BST; // tmp是要删除
if(BST->left && BST->right)
{ // 左右都有
BinTree tmp1=FindMin(BST->right);
BST->data=tmp1->data;
BST->right=Delete(BST->data,BST->right);
return BST;
}
else if(BST->left!=NULL)
{
BST=BST->left;
}
else if(BST->right!=NULL)
{
BST=BST->right;
} else {
// 左右子数都是空, 删除自身,并返回空
BST = NULL;
}
free(tmp);
}
return BST;
}

void PreOrderTraversal(BinTree BT)
{
if(BT)
{
PreOrderTraversal(BT->left);
printf("%d",BT->data);
PreOrderTraversal(BT->right);
}
}
int main()
{
int val;
BinTree BST;
BST=(BinTree)malloc(sizeof(TreeNode));
scanf("%d",&val);
BST->data=val;
BST->left=BST->right=NULL;
scanf("%d",&val);
while(val!=0)
{
BST=insert(val,BST);
scanf("%d",&val);
}
PreOrderTraversal(BST);
printf("\nInput number to be delete:\n");
scanf("%d",&val);
while(val!=0)
{
BST=Delete(val,BST);
scanf("%d",&val);
}
PreOrderTraversal(BST);
}
还是不对啊,而且,如果左右子树都为空那就把空指针BST->left或者BST->right赋值给BST不也还是一样,上面插入的时候有定义BST->left=BST->right=NULL所以应该的BST->left应该不是野指针吧
寻开心 2020-01-20
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode
{
int data;
BinTree left,right;
};

BinTree insert(int x,BinTree BST)
{
if(!BST)
{
BST=(BinTree)malloc(sizeof(TreeNode));
BST->data=x;
BST->left=BST->right=NULL;
}
if(x<BST->data)
{
BST->left=insert(x,BST->left);
}
if(x>BST->data)
{
BST->right=insert(x,BST->right);
}
return BST;
}



BinTree FindMin(BinTree BST)
{
while(!BST->left)
BST=BST->left;
return BST;
}

BinTree Delete(int x,BinTree BST)
{
Position tmp=NULL;
if( !BST ) {
printf("查找失败!");
return NULL;
}
else if( x < BST->data)
BST->left = Delete(x,BST->left);
else if(x>BST->data)
BST->right=Delete(x,BST->right);
else {
tmp = BST; // tmp是要删除
if(BST->left && BST->right)
{ // 左右都有
BinTree tmp1=FindMin(BST->right);
BST->data=tmp1->data;
BST->right=Delete(BST->data,BST->right);
return BST;
}
else if(BST->left!=NULL)
{
BST=BST->left;
}
else if(BST->right!=NULL)
{
BST=BST->right;
} else {
// 左右子数都是空, 删除自身,并返回空
BST = NULL;
}
free(tmp);
}
return BST;
}

void PreOrderTraversal(BinTree BT)
{
if(BT)
{
PreOrderTraversal(BT->left);
printf("%d",BT->data);
PreOrderTraversal(BT->right);
}
}
int main()
{
int val;
BinTree BST;
BST=(BinTree)malloc(sizeof(TreeNode));
scanf("%d",&val);
BST->data=val;
BST->left=BST->right=NULL;
scanf("%d",&val);
while(val!=0)
{
BST=insert(val,BST);
scanf("%d",&val);
}
PreOrderTraversal(BST);
printf("\nInput number to be delete:\n");
scanf("%d",&val);
while(val!=0)
{
BST=Delete(val,BST);
scanf("%d",&val);
}
PreOrderTraversal(BST);
}
KID6200 2020-01-20
  • 打赏
  • 举报
回复
BST=Delete(val,BST);大神,经过排查,我确定是这句出现问题,它能够执行到第一个return结束,后面出什么问题我就不知道了
KID6200 2020-01-20
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode
{
int data;
BinTree left,right;
};

BinTree insert(int x,BinTree BST)
{
if(!BST)
{
BST=(BinTree)malloc(sizeof(TreeNode));
BST->data=x;
BST->left=BST->right=NULL;
}
if(x<BST->data)
{
BST->left=insert(x,BST->left);
}
if(x>BST->data)
{
BST->right=insert(x,BST->right);
}
return BST;
}



BinTree FindMin(BinTree BST)
{
while(!BST->left)
BST=BST->left;
return BST;
}

BinTree Delete(int x,BinTree BST)
{
Position tmp;
if(!BST) printf("查找失败!");
else if(x<BST->data)
BST->left=Delete(x,BST->left);
else if(x>BST->data)
BST->right=Delete(x,BST->right);
else
if(BST->left && BST->right)
{
tmp=FindMin(BST->right);
BST->data=tmp->data;
BST->right=Delete(BST->data,BST->right);
}
else if(!BST->left)
{
BST=BST->right;
}
else if(!BST->right)
{
BST=BST->left;
}
free(tmp);
return BST;
}

void PreOrderTraversal(BinTree BT)
{
if(BT)
{
printf("%d",BT->data);
PreOrderTraversal(BT->left);
PreOrderTraversal(BT->right);
}
}
int main()
{
int val;
BinTree BST;
BST=(BinTree)malloc(sizeof(TreeNode));
scanf("%d",&val);
BST->data=val;
BST->left=BST->right=NULL;
scanf("%d",&val);
while(val!=0)
{
BST=insert(val,BST);
scanf("%d",&val);
}
scanf("%d",&val);
while(val!=0)
{
BST=Delete(val,BST);
scanf("%d",&val);
}
PreOrderTraversal(BST);
}



大神,再帮我看一次我结帖了
KID6200 2020-01-20
  • 打赏
  • 举报
回复
引用 3 楼 寻开心的回复:
void PreOrderTraversal(BinTree BT)
{
if(BT)
{

PreOrderTraversal(BT->left);
printf("%d",BT->data);

PreOrderTraversal(BT->right);
}
}


[quote=引用 2 楼 KID6200 的回复:]
[quote=引用 1 楼 寻开心的回复:]还是老提问不来结帖子,就不告诉你问题答案啦
BinTree insert(int x,BinTree BST)
{
if(!BST)
{
BST=(BinTree)malloc(sizeof(TreeNode));
BST->data=x;
BST->left=BST->right=NULL;
}
if(x<BST->data)
{
BST->left = insert(x,BST->left);
}
if(x>BST->data)
{
BST->right = insert(x,BST->right);
}
return BST;
}

我问了怎么结没人告诉我啊(捂脸)[/quote][/quote] 不是,大神,我不知道怎么结帖子
寻开心 2020-01-20
  • 打赏
  • 举报
回复
void PreOrderTraversal(BinTree BT)
{
if(BT)
{

PreOrderTraversal(BT->left);
printf("%d",BT->data);

PreOrderTraversal(BT->right);
}
}


引用 2 楼 KID6200 的回复:
[quote=引用 1 楼 寻开心的回复:]还是老提问不来结帖子,就不告诉你问题答案啦
BinTree insert(int x,BinTree BST)
{
if(!BST)
{
BST=(BinTree)malloc(sizeof(TreeNode));
BST->data=x;
BST->left=BST->right=NULL;
}
if(x<BST->data)
{
BST->left = insert(x,BST->left);
}
if(x>BST->data)
{
BST->right = insert(x,BST->right);
}
return BST;
}

我问了怎么结没人告诉我啊(捂脸)[/quote]
加载更多回复(2)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧