二叉查找树 - C语言实现(四)

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 *可以接收所有类型的指针,但是反之不可。在Cvoid *既可以赋值给任何指针,也可以被任何指针赋值。

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/xsp_happyboy/article/details/81909160
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞