一、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
//创建节点
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);
}