1 MakeEmpty例程
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
struct TreeNode{
ElementType Element;
SearchTree Left;//左儿子树
SearchTree Right;//右儿子树
}
SearchTree
MakeEmpty(SearchTree T){
if(T != NULL){
T -> Left = NULL;
T -> Right = NULL;
free(T);
}
return NULL;
}
2 Find例程
找到具有元素X节点的指针
SearchTree
Find(ElementType X,SearchTree T){//入参T代表树的根节点
if(T == NULL){
return NULL;
}else if(X < T -> Element){
return Find(X,T -> Left);
}else if(X > T -> Element){
return Find(X,T -> Right);
}else{
return T;
}
}
3 FindMin例程
SearchTree
FindMin(SearchTree T){
if(T == NULL){
return NULL;
}else if(T -> Left == NULL){
return T;
}else{
return FindMin(T -> Left);
}
}
4 FindMax例程
SearchTree
FindMax(SearchTree T){
if(T != NULL){
while(T -> Right != NULL){
T = T -> Right;
}
}
return T;
}
5 Insert例程
/*
1.先查找元素X,若查到则不做任何操作
2.若查不到,则把元素X插入到,最后查询的位置
注意:返回值为指向树根节点的指针,Insert方法的入数和返回值都是T
*/
SearchTree
Insert(ElementType X,SearchTree T){
if(T == NULL){
/* 未找到元素X,则插入X */
T = malloc(sizeof(struct TreeNode));
if(T == NULL){
//内存不够
}else{
T -> Element = X;
T -> Left = T -> Right = NULL;
}
}else if (X < T -> Element){
T -> Left = Insert(X,T -> Left);
}else if (X > T -> Element){
T -> Right = Insert(X,T -> Right);
}
//else 找到元素X直接返回
return T;
}
6 Delete例程
/* 1.待删除的元素在树叶上,则直接删除 2.待删除节点X有一个子树,则用代替X,最后删除X 3.待删除节点X有两个子树,找到右子树中的最小值Min,把Min赋予X,最后删除Min */
//返回值和Insert一样,指向树根节点的指针
SearchTree
Delete(ElementType X,SearchTree T){
Position temp;
if(T == NULL){
//元素未找到异常
}else if(X < T -> Element){
T -> Left = Delete(X,T -> Left);
}else if(X > T -> Element){
T -> Right = Delete(X,T -> Right);
}else if((T -> Left != NULL) && (T -> Right != NULL)){
/* 目标节点有两个儿子树 */
//找到目标节点右子树的最小节点
temp = FindMin(T -> Right);
//最小节点的元素覆盖目标节点元素
T -> ELement = Min -> Element;
//递归调用,删除右子树中的最小节点
T -> Right = Delete(T -> Element,T -> Right);
}else{
/* 目标节点有一个儿子树,或没有儿子树 */
temp = T;
if(T -> Left != NULL){
T = T -> Left;
}else if(T -> Right != NULL){
T = T -> Right;
}else{
T = NULL;
}
free(temp);
}
//注意返回的是根节点
return T;
}
注意:free函数void free(void *address)
只是释放空间,并不改变指针的值。建议free之后,把指针赋值为NULL。
在C++
中void *
可以接收所有类型的指针,但是反之不可。在C
中void *
既可以赋值给任何指针,也可以被任何指针赋值。