中英互译词典(二叉搜索树)

一、BSTree.h

#ifndef __BSTREE_H__
#define __BSTREE_H__

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef char* KeyType;
typedef char* ValueType;

typedef struct BSTreeNode
{
    struct BSTreeNode* _left;
    struct BSTreeNode* _right;
    KeyType _key;
    ValueType _value;
}BSTreeNode;

int BSTreeInsertR(BSTreeNode** pptree, KeyType key, ValueType value);
int BSTreeRemoveR(BSTreeNode** pptree, KeyType key);
BSTreeNode* BSTreeFindR(BSTreeNode* ptree, KeyType key);
void BSTreeInOrder(BSTreeNode* ptree);
void BSTreeDestory(BSTreeNode* ptree);

#endif __BSTREE_H__

二、BSTree.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "BSTree.h"

//创建节点
BSTreeNode* BuyBSTreeNode(KeyType key, ValueType value)
{
    BSTreeNode* cur = (BSTreeNode*)malloc(sizeof(BSTreeNode));
    assert(cur);
    cur->_key = key;
    cur->_value = value;
    cur->_left = NULL;
    cur->_right = NULL;
    return cur;
}

//递归插入
int BSTreeInsertR(BSTreeNode** pptree, KeyType key, ValueType value)
{
    if (*pptree == NULL)
    {
        *pptree = BuyBSTreeNode(key, value);
        return 1;
    }

    if (strcmp((*pptree)->_key, key) > 0)
    {
        return BSTreeInsertR(&(*pptree)->_left, key, value);
    }
    else if (strcmp((*pptree)->_key, key) < 0)
    {
        return BSTreeInsertR(&(*pptree)->_right, key, value);
    }
    else
    {
        return 0;
    }
}

//递归删除
int BSTreeRemoveR(BSTreeNode** pptree, KeyType key)
{
    if (*pptree == NULL)
    {
        return 0;
    }

    if (strcmp((*pptree)->_key, key) > 0)
    {
        return BSTreeRemoveR(&(*pptree)->_left, key);
    }
    else if (strcmp((*pptree)->_key, key) < 0)
    {
        return BSTreeRemoveR(&(*pptree)->_right, key);
    }
    else
    {
        //1.左为空
        //2.右为空
        //3.左右都不为空
        if ((*pptree)->_left == NULL)
        {
            *pptree = (*pptree)->_right;
            return 1;
        }
        else if ((*pptree)->_right == NULL)
        {
            *pptree = (*pptree)->_left;
            return 1;
        }
        else
        {
            BSTreeNode* subleft = (*pptree)->_right;
            while (subleft->_left)
            {
                subleft = subleft->_left;
            }
            strcpy((*pptree)->_key, subleft->_key);
            return BSTreeRemoveR(&(*pptree)->_right, subleft->_key);
        }
    }
}

//递归查找
BSTreeNode* BSTreeFindR(BSTreeNode* ptree, KeyType key)
{
    if (ptree == NULL)
    {
        return NULL;
    }

    if (strcmp(ptree->_key, key) > 0)
    {
        return BSTreeFindR(ptree->_left, key);
    }
    else if (strcmp(ptree->_key, key) < 0)
    {
        return BSTreeFindR(ptree->_right, key);
    }
    else
    {
        return ptree;
    }
}

//中序遍历
void BSTreeInOrder(BSTreeNode* ptree)
{
    if (ptree == NULL)
    {
        return;
    }
    BSTreeInOrder(ptree->_left);
    printf("[%s %s] ", ptree->_key, ptree->_value);
    BSTreeInOrder(ptree->_right);
}

//销毁
void BSTreeDestory(BSTreeNode* ptree)
{
    if (ptree == NULL)
    {
        return;
    }
    BSTreeDestory(ptree->_left);
    BSTreeDestory(ptree->_right);
    free(ptree);
}

三、Test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "BSTree.h"

void Menu()
{
    printf("****************\n");
    printf("**            **\n");
    printf("**   1.查询   **\n");
    printf("**   0.退出   **\n");
    printf("**            **\n");
    printf("****************\n");
}

int main()
{
    BSTreeNode* tree = NULL;

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

    int op = 0;
    do{
        Menu();
        printf("请选择:");
        scanf("%d", &op);
        switch (op)
        {
        case 1:
        {
                  fflush(stdin); //清除内存缓冲区
                  char* str = (char*)malloc(10 * sizeof(char));
                  printf("请输入查询单词:");
                  gets(str);
                  BSTreeNode* cur = BSTreeFindR(tree, str);
                  if (cur)
                  {
                      printf("翻译结果为:%s\n", cur->_value);
                  }
                  else
                  {
                      printf("未找到该词\n");
                  }
                  free(str);
                  str = NULL;
        }
            break;
        case 0:
        {
                  BSTreeDestory(tree);
                  system("pause");
                  return 0;
        }
            break;
        }
    } while (op);
}

猜你喜欢

转载自blog.csdn.net/X_Perseverance/article/details/80295717
今日推荐