#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//插入和删除函数必须都得以返回指针的形式实现
//对于插入,看其最后的NULL时插入就能看出
//对于删除,本质删除的是只有一个儿子和没有儿子的节点,想其删除没有儿子的节点的情况
//若不返回指针,此节点的父亲就有个指针指向非法区了
struct TreeNode{
int Element;
struct TreeNode* Left;
struct TreeNode* Right;
};
struct TreeNode* Init(){//初始化
return NULL;
}
void PreTraversal(struct TreeNode* BinSearchTree)//前序遍历
{
if(BinSearchTree!=NULL){
printf("%d ",BinSearchTree->Element);
PreTraversal(BinSearchTree->Left);
PreTraversal(BinSearchTree->Right);
}
return;
}
struct TreeNode* Find(int data,struct TreeNode* BinSearchTree)//查找
{
if(BinSearchTree==NULL)
return NULL;
else if(BinSearchTree->Left!=NULL&&data<BinSearchTree->Element)
return BinSearchTree->Left;
else if(BinSearchTree->Right!=NULL&&data>BinSearchTree->Element)
return BinSearchTree->Right;
else
return BinSearchTree;
}
struct TreeNode* FindMax(struct TreeNode* BinSearchTree)//查找最大值所在的节点
{
if(BinSearchTree==NULL)
return NULL;
else if(BinSearchTree->Right!=NULL)
return FindMax(BinSearchTree->Right);
else
return BinSearchTree;
}
struct TreeNode* FindMin(struct TreeNode* BinSearchTree)//查找最小值所在的节点
{
if(BinSearchTree==NULL)
return NULL;
else if(BinSearchTree->Left!=NULL)
return FindMin(BinSearchTree->Left);
else
return BinSearchTree;
}
struct TreeNode* Insert(int data,struct TreeNode* BinSearchTree)//插入
{
if(BinSearchTree==NULL){
BinSearchTree=(struct TreeNode*)malloc(sizeof(struct TreeNode));
BinSearchTree->Element=data;
BinSearchTree->Left=NULL;
BinSearchTree->Right=NULL;
return BinSearchTree;
}
else if(data<BinSearchTree->Element)
BinSearchTree->Left=Insert(data,BinSearchTree->Left);
else if(data>BinSearchTree->Element)
BinSearchTree->Right=Insert(data,BinSearchTree->Right);
else
printf("ERROR\n");
return BinSearchTree;
}
struct TreeNode* Delete(int data,struct TreeNode* BinSearchTree)//删除
{
if(BinSearchTree==NULL)
return NULL;
else if(data>BinSearchTree->Element)
BinSearchTree->Right=Delete(data,BinSearchTree->Right);
else if(data<BinSearchTree->Element)
BinSearchTree->Left=Delete(data,BinSearchTree->Left);
else if(BinSearchTree->Left&&BinSearchTree->Right){//删除有两个孩子的节点,可找左树最大与右树最小代替其,本质删除没有儿子的节点
struct TreeNode* Temp=FindMin(BinSearchTree->Right);
BinSearchTree->Element=Temp->Element;
BinSearchTree->Right=Delete(Temp->Element,BinSearchTree->Right);
}
else{//删除有一个/零个孩子的节点
struct TreeNode* Temp;
Temp=BinSearchTree;
if(BinSearchTree->Left!=NULL)
BinSearchTree=BinSearchTree->Left;
else//此处包含了右儿子也为空的情况,即零个孩子
BinSearchTree=BinSearchTree->Right;
free(Temp);
}
return BinSearchTree;
}
int main(){
struct TreeNode* BinSearchTree;
//初始化
BinSearchTree=Init();
//插入
BinSearchTree=Insert(4,BinSearchTree);
BinSearchTree=Insert(3,BinSearchTree);
BinSearchTree=Insert(6,BinSearchTree);
BinSearchTree=Insert(5,BinSearchTree);
BinSearchTree=Insert(7,BinSearchTree);
BinSearchTree=Insert(2,BinSearchTree);
//遍历一遍,便于检验代码
PreTraversal(BinSearchTree);
putchar('\n');
//删除有零个孩子的2节点
BinSearchTree=Delete(2,BinSearchTree);
PreTraversal(BinSearchTree);
putchar('\n');
//重新插入2
BinSearchTree=Insert(2,BinSearchTree);
//删除有一个孩子的3节点
Delete(3,BinSearchTree);
PreTraversal(BinSearchTree);
putchar('\n');
//删除有两个孩子的6节点
Delete(6,BinSearchTree);
PreTraversal(BinSearchTree);
putchar('\n');
}
二叉搜索树
最新推荐文章于 2021-05-17 15:14:09 发布