二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:
若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
任意节点的左、右子树也分别为二叉查找树。
没有键值相等的节点。
今天我使用搜索二叉树来实现一个简单的英汉互译的小字典
首先需要把英文插入二叉树结构,根据每个数据的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 查看本文章