二叉查找树的节点删除问题

yrf-tan 2021-04-11 04:26:19
求救大佬!
在编写二叉查找树时出现了一个问题,就是删除节点时会导致后面的连接断开,我以为是指针修改错误,使用指针引用作为Delete函数参数依然无果
输出示例;
Please input number.
1
2
3
4
5
6
q
$$
1
2
3
4
整体代码:
#include<iostream>
typedef int ElementType;
struct TreeNode{
ElementType data;
struct TreeNode* Left=nullptr;
struct TreeNode* Right=nullptr;
};
typedef struct TreeNode* Position;
typedef struct TreeNode* SearchTree;
using namespace std;
SearchTree MakeEmpty(SearchTree);
void Input(SearchTree);
Position Find(ElementType,SearchTree);
Position FindMin(SearchTree);
Position FindMax(SearchTree);
SearchTree Insert(ElementType,SearchTree);
SearchTree Delete(ElementType,SearchTree&);
void PrintTree(SearchTree);
int main(void){
struct TreeNode p;
SearchTree s=&p;
MakeEmpty(s);
Input(s);
Delete(4,s);
PrintTree(s);
return 0;
}
SearchTree MakeEmpty(SearchTree T){
if(T!=nullptr){
MakeEmpty(T->Left);
MakeEmpty(T->Right);
delete(T);
}
return nullptr;
}
void Input(SearchTree T){
int x;
cout<<"Please input number."<<endl;
cin>>x;
T->data=x;
while(cin>>x) Insert(x,T);
}
Position Find(ElementType X,SearchTree T){
if(T==nullptr)return nullptr;
else if(X<T->data)return Find(X,T->Left);
else if(X>T->data)return Find(X,T->Right);
else return T;
}
Position FindMin(SearchTree T){
if(T==nullptr)return nullptr;
else if(T->Left==nullptr)return T;
else return FindMin(T->Left);
//if(T!=nullptr)while(T->Left!=nullptr)T=T->Left;
//return T;
}
Position FindMax(SearchTree T){
if(T!=nullptr)while(T->Right!=nullptr)T=T->Right;
return T;
}
SearchTree Insert(ElementType X,SearchTree T){
if(T==nullptr){ //create and return a one-node tree
T=new struct TreeNode;
if(T==nullptr){
cout<<"Out of space!!!";
exit(0);
}
else T->data=X;
}else if(X<T->data) {
T->Left=Insert(X,T->Left);
}else if(X>T->data) {
T->Right=Insert(X,T->Right);
}
/*Else X is in the tree already; we'll do nothing*/
return T;/*Don't forget this line*/
}
SearchTree Delete(ElementType X,SearchTree& T){
/*Replace with smallest in right subtree*/
Position TempCell;
if(T==nullptr){
cout<<"Element not found.";
exit(0);
}
else if(X<T->data) T->Left=Delete(X,T->Left);
else if(X>T->data) T->Right=Delete(X,T->Right);
else if(T->Left&&T->Right){
/* The node should be delete has two children*/
TempCell=FindMin(T->Right);
T->data=TempCell->data;
T->Right=Delete(T->data,T->Right);
}else{
/* The node should be delete has one or zero children*/
TempCell=T;
if(T->Left=nullptr) T=T->Right;
else if(T->Right=nullptr) T=T->Left;
cout<<"$$"<<endl;
free(TempCell);
TempCell=nullptr;
}
return T;
}
void PrintTree(SearchTree T){
if(T!=nullptr){
PrintTree(T->Left);
cout<<T->data<<endl;
PrintTree(T->Right);
}
}
...全文
34 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,639

社区成员

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

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