Position Find( BinTree BST, ElementType X ){
if(!BST) return NULL;
//不能像Delete一样递归查找,不然叶子结点会被清空
if(X<BST->Data) return Find(BST->Left,X);
else if(X>BST->Data) return Find(BST->Right,X);
else return BST;
}
Position FindMin( BinTree BST ){
//注意判空
if(!BST) return NULL;
while(BST->Left){
BST=BST->Left;
}
return BST;
}
Position FindMax( BinTree BST ){
//注意判空
if(!BST) return NULL;
while(BST->Right){
BST=BST->Right;
}
return BST;
}
BinTree Insert( BinTree BST, ElementType X ){
if(!BST){
BST=(BinTree)malloc(sizeof(struct TNode));
BST->Data=X;
BST->Left=BST->Right=NULL;
}else{
if(X<BST->Data) BST->Left=Insert(BST->Left,X);
else BST->Right=Insert(BST->Right,X);
}
return BST;
}
//因为最后要返回删除后的树根,返回BST就很有可能出错,所以需要循环删除
BinTree Delete( BinTree BST, ElementType X ){
if(!BST){
//由于裁判程序,此处要先输出Not Found
printf("Not Found\n");
return NULL;
}
if(X<BST->Data) BST->Left=Delete(BST->Left,X);
else if(X>BST->Data) BST->Right=Delete(BST->Right,X);
else{
BinTree tmp=NULL;
if(BST->Left && BST->Right){
tmp=FindMin(BST->Right);
BST->Data=tmp->Data;//结点值替换最易,不改变结构,不然需要修改指针
BST->Right=Delete(BST->Right,tmp->Data);//只需要修改右子树,左子树不变的
}else{
tmp=BST;
//不能改为肯定,不然会漏掉左右儿子均无的情况
//注意是else if,全空就不需要调整,否则NULL->Left会报错
if(!BST->Left) BST=BST->Right;
else if(!BST->Right) BST=BST->Left;
free(tmp);
}
}
return BST;
}
【PTA】二叉搜索树的操作集 (30 分)
最新推荐文章于 2023-10-16 11:04:06 发布