二叉搜索树应用 : 模拟实现一个简单的词典
实现功能 :
- 插入 ( 与二叉搜索树的插入方法一致 )
- 删除 ( 与二叉搜索树的删除方法一致 )
- 查询 ( 与二叉搜索树的查询方法一致 )
- 打印 ( 中序打印 )
二叉树搜索树的基本操作 : 传送门 https://blog.csdn.net/ds19980228/article/details/82120429
数据结构 :
typedef struct BSTreeNode
{
//左孩子节点
struct BSTreeNode* _left;
//右孩子节点
struct BSTreeNode* _right;
//钥匙
BSTKeyType _key;
//查询的信息
BSTKeyType _value;
//信息存储的个数
BSTValueType _number;
}BSTreeNode
BinarySearchTreeKV.h
#pragma once
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <string.h>
typedef char* BSTKeyType;
typedef int BSTValueType;
typedef struct BSTreeNode
{
struct BSTreeNode* _left;
struct BSTreeNode* _right;
BSTKeyType _key;
BSTKeyType _value;
BSTValueType _number;
}BSTreeNode;
//插入
int BSTreeInsert(BSTreeNode** ppTree, BSTKeyType key, BSTValueType value);
//删除
int BSTreeRemove_R(BSTreeNode** ppTree, BSTKeyType key);
//查询
BSTreeNode* BSTreeFind(BSTreeNode** ppTree, BSTKeyType key);
//翻译
void BSTreeTranslate(BSTreeNode** ppTree, BSTKeyType key);
//中序打印
void BSTreeInOrder(BSTreeNode** ppTree);
//测试
void TestBSTreeKV();
BinarySearchTreeKV.c
#define _CRT_SECURE_NO_WARNINGS
#include "BinarySearchTreeKV.h"
//申请节点
BSTreeNode * BuyBSTreeNode(BSTKeyType key, BSTKeyType value)
{
BSTreeNode * node = (BSTreeNode*)malloc(sizeof(BSTreeNode));
node->_key = (char*)malloc(strlen(key) + 1);
strcpy(node->_key, key);
node->_value = (char*)malloc(strlen(value) + 1);
strcpy(node->_value, value);
node->_right = NULL;
node->_left = NULL;
node->_number = 1;
return node;
}
//插入
int BSTreeInsert(BSTreeNode** ppTree, BSTKeyType key, BSTKeyType value)
{
if (*ppTree == NULL)
{
*ppTree = BuyBSTreeNode(key, value);
return 1;
}
if (strcmp((*ppTree)->_key, key) > 0)
return BSTreeInsert(&(*ppTree)->_left, key, value);
else if (strcmp((*ppTree)->_key, key) < 0)
return BSTreeInsert(&(*ppTree)->_right, key, value);
else
(*ppTree)->_number++;
return 0;
}
//删除(递归)
int BSTreeRemove_R(BSTreeNode** ppTree, BSTKeyType key)
{
BSTreeNode * parent;
BSTreeNode * cur;
assert(ppTree);
cur = *ppTree;
parent = NULL;
if (cur == NULL)
return 0;
if (strcmp(cur->_key, key) == 0)
{
if (cur->_left == NULL)
*ppTree = cur->_right;
else if (cur->_right == NULL)
*ppTree = cur->_left;
else
{
parent = cur->_right;
while (parent->_left)
parent = parent->_left;
cur->_key = parent->_key;
cur->_value = parent->_value;
return BSTreeRemove_R(&cur->_right, cur->_key);
}
free(cur);
cur = NULL;
return 1;
}
else if (strcmp(cur->_key, key) > 0)
return BSTreeRemove_R(&cur->_left, key);
else
return BSTreeRemove_R(&cur->_right, key);
return 0;
}
//查询
BSTreeNode* BSTreeFind(BSTreeNode** ppTree, BSTKeyType key)
{
if (*ppTree == NULL)
return NULL;
if (strcmp((*ppTree)->_key, key) == 0)
return *ppTree;
else if (strcmp((*ppTree)->_key, key) > 0)
BSTreeFind(&(*ppTree)->_left, key);
else
BSTreeFind(&(*ppTree)->_right, key);
}
//中序打印
void BSTreeInOrder(BSTreeNode** ppTree)
{
BSTreeNode * cur = *ppTree;
if (*ppTree == NULL)
return;
assert(*ppTree);
BSTreeInOrder(&cur->_left);
printf("%8s:: %4s :: %2d \n", cur->_key, cur->_value,cur->_number);
BSTreeInOrder(&cur->_right);
}
//翻译
void BSTreeTranslate(BSTreeNode** ppTree, BSTKeyType key)
{
BSTreeNode * cur;
cur = BSTreeFind(ppTree, key);
if (cur == NULL)
{
printf("请输入正确的字符!\n");
return;
}
else
{
printf("该字符的含义为 : %s\n", cur->_value);
return;
}
}
void TestBSTreeKV()
{
BSTreeNode * tree = NULL;
char str[1000];
char val[1000];
int a = 0;
BSTreeInsert(&tree, "tree", "树");
BSTreeInsert(&tree, "sort", "排序");
BSTreeInsert(&tree, "binary", "二分");
BSTreeInsert(&tree, "hash", "哈希");
BSTreeInsert(&tree, "list", "链表");
BSTreeInsert(&tree, "xb", "学霸");
BSTreeInsert(&tree, "hp", "哈皮");
BSTreeInsert(&tree, "xb", "学霸");
do
{
printf("请选择: 1 : 插入模式\n 2 : 查询模式\n 3 : 删除模式\n 4 : 打印模式\n 0 : 退出\n");
scanf("%d", &a);
switch (a)
{
case 1:
printf("请输入插入的信息 !\n");
scanf("%s", str);
scanf("%s", val);
BSTreeInsert(&tree,str,val);
break;
case 2:
printf("请输入要查询信息的关键字 !\n");
scanf("%s", str);
BSTreeTranslate(&tree, str);
break;
case 3:
scanf("%s", str);
printf("请输入要删除信息的关键字 !\n");
BSTreeRemove_R(&tree, str);
break;
case 4:
BSTreeInOrder(&tree);
break;
case 0:
break;
default:
break;
}
printf("\n");
} while (a != 0);
}
Test.c
#include "BinarySearchTreeKV.h"
int main()
{
TestBSTreeKV();
system("pause");
return 0;
}
测试结果 :