#include "stdafx.h"
#include "iostream"
#include "stdlib.h"
#define ElementType int
typedef struct TreeNode *tree;
struct TreeNode{
ElementType Date;
tree Left;
tree Right;
};
tree MakeEmpty(tree T);
tree Insert(ElementType x,tree T);
tree Find(ElementType x,tree T);
tree FindMax(tree T);
tree FindMin(tree T);
tree Delete(ElementType x,tree T);
tree MakeEmpty(tree T)
{
if(T!=NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
tree FindMax(tree T)
{
if(T==NULL)
return NULL;
else if(T->Right==NULL)
return T;
else
return FindMax(T->Right);
}
tree FindMin(tree T)
{
if(T!=NULL)
{
while(T->Left!=NULL)
T=T->Left;
}
return T;
}
tree Insert(ElementType x,tree T)
{
if(T==NULL)
{
T=(tree)malloc(sizeof(struct TreeNode));
if(T==NULL)
printf("error\n");
else{
T->Date=x;
T->Left=T->Right=NULL;
}
}
else if(x>T->Date)
T->Right=Insert (x,T->Right);//之前这里光Insert但并没有赋给T->Right,所以树根本没建立起来;
else if(x<T->Date)
T->Left=Insert(x,T->Left);
return T;
}
tree Find(ElementType x,tree T)
{
if(NULL==T)
return NULL;
else if(x==T->Date)
return T;
else if(x>T->Date)
return Find(x,T->Right);
else
return Find(x,T->Left);
}
tree Delete(ElementType x,tree T)
{
tree tmp;
//T=Find(x,T);
if(T==NULL)
printf("error");
else if(x<T->Date)
T->Left=Delete(x,T->Left);
else if(x>T->Date)
T->Right=Delete(x,T->Right);
else if(T->Left&&T->Right)//这里是当树的左右节点都存在的情况,策略是用右子树的最小数据代替要删除的点
{
tmp=FindMin(T->Right);
T->Date=tmp->Date;
T->Right=Delete(T->Date,T->Right);
}
else//只有一个节点或没有的情况;
{
tmp=T;
if(T->Left==NULL)
T=T->Right;
else if(T->Right==NULL)
T=T->Left;
free(tmp);//这里是要释放原结点
}
return T;
}
关于二叉搜索树的一些操作
最新推荐文章于 2019-01-08 02:13:39 发布