c二叉搜索树实现小英汉字典

二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:

  1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  3. 任意节点的左、右子树也分别为二叉查找树。

  4. 没有键值相等的节点。
    今天我使用搜索二叉树来实现一个简单的英汉互译的小字典
    首先需要把英文插入二叉树结构,根据每个数据的ASSIC值不同来判断当前插入节点的位置,从第一个字母开始比较,比当前ASSIC值小的单词往左插,比它大的往右插
    结构体的定义

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

    KeyType _key;//英文单词
    ValueType _value;//对应的中文

}BSTreeNode;

建立新的节点给他赋值

BSTreeNode* BuyBSTreeNode(KeyType key, ValueType value)
{
    BSTreeNode*newnode = (BSTreeNode*)malloc(sizeof(BSTreeNode));
    newnode->_left = NULL;
    newnode->_right = NULL;
    newnode->_key = key;
    newnode->_value = value;
    return newnode;
}

插入一个节点
当插入时树为空树,直接创建一个节点
当树不为空时,创建一个节点判断这个节点的位置,插入这个节点

int BSTreeInsertR(BSTreeNode** tree, KeyType key, ValueType value)
{
    assert(value);
    if (*tree == NULL)//当树为空树时 
    {
        BSTreeNode*newnode = BuyBSTreeNode(key, value);
        *tree = newnode;
    }
    else
    {
        BSTreeNode*newnode = BuyBSTreeNode(key, value);
        BSTreeNode*parent =*tree;//定义父亲节点便于插入节点
        BSTreeNode*child = *tree;//孩子节点找到节点插入位置
        char *cur = child->_key;//指针比较单词该插入的位置
        char *next = newnode->_key;//指针记录插入节点的单词大小
        while (child)//循环找到位置
        {
            parent = child;
            cur = parent->_key;
            next = newnode->_key;
            if (*cur >*next)//当插入节点的ASSIC值小于当前节点的值往左遍历找位置
            {
                child = child->_left;
                if (child == NULL)
                {
                    parent->_left = newnode;
                }

            }
            else if (*cur <*next)//当插入节点的ASSIC值大于当前节点的值往右遍历找位置

            {
                child = child->_right;
                if (child == NULL)
                {
                    parent->_right = newnode;
                }
            }
            else {//当两个指针assic值相等指针同时++
                cur++;
                next++;
            }

        }
    }

}

查找英汉互译

BSTreeNode* BSTreeFindR(BSTreeNode* tree, KeyType key)
{
    assert(tree&&key);
    BSTreeNode*tmp = tree;
    char*cur = tree->_key;
    char*aim = key;
    while (tmp)
    {
        if (*cur == *aim)
        {
            cur++;
            aim++;
            if (*cur == '\0')
            {
                if (*aim != '\0')
                {
                    break;
                }
                else
                {
                    return tmp;
                }
            }
            if (*aim == '\0')
            {
                if (*cur != '\0')
                {
                    break;
                }
                else {
                    return tmp;
                }
            }
        }
        if (*cur > *aim)
        {
            tmp = tmp->_left;
            cur = tmp->_key;
        }
        if (*cur < *aim)
        {
            tmp = tmp->_right;
            cur = tmp->_key;
        }
    }
    return NULL;
}

这里写图片描述
完整代码
test.h

#pragma once
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
typedef char* KeyType;
typedef char* ValueType;

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

    KeyType _key;
    ValueType _value;

}BSTreeNode;

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

void TestBSTree()
{
    BSTreeNode* tree = NULL;

    BSTreeInsertR(&tree, "tree", "树");
    BSTreeInsertR(&tree, "sort", "排序");
    BSTreeInsertR(&tree, "binary", "二分");
    BSTreeInsertR(&tree, "return", "返回");
    BSTreeInsertR(&tree, "hash", "哈希");
    BSTreeInsertR(&tree, "list", "链表");

    printf("%s\n", BSTreeFindR(tree, "tree")->_value);
    printf("%s\n", BSTreeFindR(tree, "return")->_value);
    printf("%s\n", BSTreeFindR(tree, "hash")->_value);
    printf("%s\n", BSTreeFindR(tree, "list")->_value);![这里写图片描述](https://img-blog.csdn.net/20180802175646714?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDg1MzA3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
};

test.c

#include"test.h"
BSTreeNode* BuyBSTreeNode(KeyType key, ValueType value)
{
    BSTreeNode*newnode = (BSTreeNode*)malloc(sizeof(BSTreeNode));
    newnode->_left = NULL;
    newnode->_right = NULL;
    newnode->_key = key;
    newnode->_value = value;
    return newnode;
}
int BSTreeInsertR(BSTreeNode** tree, KeyType key, ValueType value)
{
    assert(value);
    if (*tree == NULL)
    {
        BSTreeNode*newnode = BuyBSTreeNode(key, value);
        *tree = newnode;
    }
    else
    {
        BSTreeNode*newnode = BuyBSTreeNode(key, value);
        BSTreeNode*parent =*tree;
        BSTreeNode*child = *tree;
        char *cur = child->_key;
        char *next = newnode->_key;
        while (child)
        {
            parent = child;
            cur = parent->_key;
            next = newnode->_key;
            if (*cur >*next)
            {
                child = child->_left;
                if (child == NULL)
                {
                    parent->_left = newnode;
                }

            }
            else if (*cur <*next)
            {
                child = child->_right;
                if (child == NULL)
                {
                    parent->_right = newnode;
                }
            }
            else {
                cur++;
                next++;
            }

        }
    }

}
BSTreeNode* BSTreeFindR(BSTreeNode* tree, KeyType key)
{
    assert(tree&&key);
    BSTreeNode*tmp = tree;
    char*cur = tree->_key;
    char*aim = key;
    while (tmp)
    {
        if (*cur == *aim)
        {
            cur++;
            aim++;
            if (*cur == '\0')
            {
                if (*aim != '\0')
                {
                    break;
                }
                else
                {
                    return tmp;
                }
            }
            if (*aim == '\0')
            {
                if (*cur != '\0')
                {
                    break;
                }
                else {
                    return tmp;
                }
            }
        }
        if (*cur > *aim)
        {
            tmp = tmp->_left;
            cur = tmp->_key;
        }
        if (*cur < *aim)
        {
            tmp = tmp->_right;
            cur = tmp->_key;
        }
    }
    return NULL;
}
int main()
{
    TestBSTree();
    system("pause");
    return 0;
}

这里写图片描述

扫描二维码关注公众号,回复: 2758650 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_40853073/article/details/81365017