数据结构--二叉搜索树( KeyValue模型 )

二叉搜索树应用 : 模拟实现一个简单的词典

实现功能 : 

  1. 插入 ( 与二叉搜索树的插入方法一致 )
  2. 删除 ( 与二叉搜索树的删除方法一致 )
  3. 查询 ( 与二叉搜索树的查询方法一致 )
  4. 打印 ( 中序打印 )

二叉树搜索树的基本操作 : 传送门  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;
}

测试结果 :

         

猜你喜欢

转载自blog.csdn.net/ds19980228/article/details/82187913
今日推荐