二叉搜索树应用

1.判断一个单词是否拼写正确(递归)

//key模型
typedef char* KeyType;
typedef char* ValueType;

typedef struct BSTreeNode
{
    struct BSTreeNode* _left;
    struct BSTreeNode* _right;

    KeyType _key;
    ValueType _value;

}BSTreeNode;


BSTreeNode* BuyBSTreeNode(KeyType key);
int BSTreeInsertR(BSTreeNode** tree, KeyType key);
BSTreeNode* BSTreeFindR(BSTreeNode* tree, KeyType key);
int BSTreeRemoveR(BSTreeNode** tree, KeyType key);


BSTreeNode* BuyBSTreeNode(KeyType key)
{
    BSTreeNode* node = (BSTreeNode*)malloc(sizeof(BSTreeNode));
    assert(node);

    node->_key =key;
    node->_left = NULL;
    node->_right = NULL;
    return node;
}

int BSTreeInsertR(BSTreeNode** tree, KeyType key)
{

    if (*tree == NULL)
    {
        *tree = BuyBSTreeNode(key);
        return 0;
    }
    int ret = strcmp((*tree)->_key, key);
    if (ret>0)
    {
        return BSTreeInsertR(&(*tree)->_left, key);
    }
    else if (ret<0)
    {
        return BSTreeInsertR(&(*tree)->_right, key);
    }
    else
    {
        return -1;
    }
}


BSTreeNode* BSTreeFindR(BSTreeNode* tree, KeyType key)
{
    if (tree == NULL)
    {
        return NULL;
    }
    int ret = strcmp(tree->_key, key);
    if (ret>0)
    {
        return BSTreeFindR(tree->_left, key);//左子树
    }
    else if (ret<0)
    {
        return BSTreeFindR(tree->_right, key);
    }
    else
        return tree;//找到了
}


int BSTreeRemoveR(BSTreeNode** tree, KeyType key)
{
    if ((*tree) == NULL)
    {
        return -1;
    }
    int ret = strcmp((*tree)->_key, key);
    if (ret > 0)
    {
        return BSTreeRemoveR(&(*tree)->_left, key);
    }
    else if (ret < 0)
    {
        return BSTreeRemoveR(&(*tree)->_right, key);
    }
    else
    {
        //三种情况,左为空,右为空,左右均不为空
        BSTreeNode*cur = *tree;
        BSTreeNode*del = cur;
        if (cur->_left == NULL)
        {
            *tree = cur->_right;
        }
        else if (cur->_right == NULL)
        {
            *tree = cur->_left;
        }
        else
        {
            BSTreeNode* parent = cur;
            BSTreeNode* sub = cur->_right;
            while (sub->_left)
            {
                parent = sub;
                sub = sub->_left;
            }
            del = sub;
            cur->_key = sub->_key;

            if (parent->_left = sub)
            {
                parent->_left = sub->_right;
            }
            else
            {
                parent->_right = sub->_right;
            }
        }
            free(del);

        return 0;
    }
}

//测试用例
void TestBSTree()
{
    BSTreeNode *tree = NULL;

    BSTreeInsertR(&tree, "open");
    BSTreeInsertR(&tree, "door");
    BSTreeInsertR(&tree, "list");
    BSTreeInsertR(&tree, "hash");

    printf("%s\n", BSTreeFindR(tree, "open")->_key);
    printf("%s\n", BSTreeFindR(tree, "list")->_key);
    printf("%s\n", BSTreeFindR(tree, "hash")->_key);
    printf("%s\n", BSTreeFindR(tree, "door")->_key);

    printf("%p\n", BSTreeFindR(tree, "pppp"));
    printf("%p\n", BSTreeFindR(tree, "msdn"));

    BSTreeRemoveR(&tree, "hash");
    printf("%p\n", BSTreeFindR(tree, "hash"));

}

测试结果为:
这里写图片描述

2.请模拟实现一个简单的中英互译的字典

//key value模型

BSTreeNode* BuyBSTreeNode(KeyType key, ValueType value)
{
    BSTreeNode* node = (BSTreeNode*)malloc(sizeof(BSTreeNode));
    assert(node);

    node->_key = key;
    node->_value = value;
    node->_left = NULL;
    node->_right = NULL;
    return node;
}

int BSTreeInsertR(BSTreeNode** tree, KeyType key, ValueType value)
{

    if (*tree == NULL)
    {
        *tree = BuyBSTreeNode(key, value);
        return 0;
    }
    int ret = strcmp((*tree)->_key, key);
    if (ret>0)
    {
        return BSTreeInsertR(&(*tree)->_left, key,value);
    }
    else if (ret<0)
    {
        return BSTreeInsertR(&(*tree)->_right, key, value);
    }
    else
    {
        return -1;
    }
}

BSTreeNode* BSTreeFindR(BSTreeNode* tree, KeyType key)
{
    if (tree == NULL)
    {
        return NULL;
    }
    int ret = strcmp(tree->_key, key);
    if (ret>0)
    {
        return BSTreeFindR(tree->_left, key);//左子树
    }
    else if (ret<0)
    {
        return BSTreeFindR(tree->_right, key);
    }
    else
        return tree;//找到了
}


int BSTreeRemoveR(BSTreeNode** tree, KeyType key)
{
    if ((*tree) == NULL)
    {
        return -1;
    }
    int ret = strcmp((*tree)->_key, key);
    if (ret > 0)
    {
        return BSTreeRemoveR(&(*tree)->_left, key);
    }
    else if (ret < 0)
    {
        return BSTreeRemoveR(&(*tree)->_right, key);
    }
    else
    {
        //三种情况,左为空,右为空,左右均不为空
        BSTreeNode*cur = *tree;
        BSTreeNode*del = cur;
        if (cur->_left == NULL)
        {
            *tree = cur->_right;
        }
        else if (cur->_right == NULL)
        {
            *tree = cur->_left;
        }
        else
        {
            BSTreeNode* parent = cur;
            BSTreeNode* sub = cur->_right;
            while (sub->_left)
            {
                parent = sub;
                sub = sub->_left;
            }
            del = sub;
            cur->_key = sub->_key;

            if (parent->_left = sub)
            {
                parent->_left = sub->_right;
            }
            else
            {
                parent->_right = sub->_right;
            }

        }
        free(del);
        return 0;
    }
}


void TestBSTree1()
{
    BSTreeNode *tree = NULL;

    BSTreeInsertR(&tree, "open","开放");
    BSTreeInsertR(&tree, "door","门");
    BSTreeInsertR(&tree, "list","清单");
    BSTreeInsertR(&tree, "hash","哈希");

    printf("%s\n", BSTreeFindR(tree, "open")->_value);
    printf("%s\n", BSTreeFindR(tree, "list")->_value);
    printf("%s\n", BSTreeFindR(tree, "hash")->_value);
    printf("%s\n", BSTreeFindR(tree, "door")->_value);

    printf("%p\n", BSTreeFindR(tree, "pppp"));
    printf("%p\n", BSTreeFindR(tree, "msdn"));

    BSTreeRemoveR(&tree, "hash");
    printf("%p\n", BSTreeFindR(tree, "hash"));

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值