搜索二叉树

搜索二叉树

//类似创建一个单节点树,但是贴合树的递归定义
SearchTree MakeEmpty(SearchTree T)
{
    if(T != NULL)
    {
        MakeEmpty(T->Left);
        MakeEmpty(T->Right);
        free(T);
    }

    return NULL;
}
//返回指向树中具有关键字的节点的指针,如果这样的节点不存在则返回NULL
Position Find(int X, SearchTree T)
{
    if(T == NULL)
    {
        return NULL;
    }

    if(X < T->num)
    {
        return Find(X, T->Left);
    }
    else if(X > T->num)
    {
        return Find(X, T->Right);
    }
    else
    {
        return T;
    }
}
//找到最小的元素
//根据查找二叉树的定义,最小元素在二叉树的最左端
Position FindMin(SearchTree T)
{
    if(T == NULL)
    {
        return NULL;
    }
    else if(T->Left == NULL)
    {
        return T;
    }
    else
    {
        return FindMin(T->Left);
    }
}
//找到最大的元素
Position FindMax(SearchTree T)
{
    if(T != NULL)
    {
        while(T->Right != NULL)
        {
            T = T->Right;
        }
    }

    return T;
}
//插入
SearchTree Insert(int X, SearchTree T)
{
    if( T == NULL)
    {
        T = malloc(sizeof(struct TreeNode));

        if(T == NULL)
        {
            printf("Out of Space!\n");
            exit(EXIT_FAILURE);
        }

        T->num = X;
        T->Left = T->Right = NULL;
    }
    else if(X < T->num)
    {
        T->Left = Insert(X, T->Left);
    }
    else if(X > T->num)
    {
        T->Right = Insert(X, T->Right);
    }

    return T;
}

被删除得节点分为两类:
1、没有或有一个儿子→将一个儿子保留(有选择),然后删除节点
2、有两个儿子→从右子代里找到最小的与根交换,然后删除

SearchTree Delete(int X, SearchTree T)
{
    Position TmpCell;

    if(T == NULL)
    {
        printf("Element not Found\n");
        exit(EXIT_FAILURE);
    }
    else if(X < T->num)
    {
        T->Left = Delete(X, T->Left);
    }
    else if(X > T->num)
    {
        T->Right = Delete(X, T->Right);
    }
    else if(T->Left && T->Right)
    {
        TmpCell = FindMin(T->Right);
        T->num = TmpCell->num;
        T->Right = Delete(T->num, T->Right);
    }
    else
    {
        TmpCell = T;
        if(T->Left == NULL)
        {
            T = T->Right;
        }
        else if(T->Right == NULL)
        {
            T = T->Left;
        }
        free(TmpCell);
    }

    return T;
}

树的结构

struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;

struct TreeNode
{
    int num;
    SearchTree Left;
    SearchTree Right;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值