搜索二叉树的应用
1. 判断一个单词是否拼写正确
2. 请模拟实现一个简单的中英互译的字典
2. 请模拟实现一个简单的中英互译的字典
3. log文件中有许多异常重复的IP地址,请统计出每个异常IP出现了多少次?
利用上篇搜索二叉树的结构稍作修改
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);
int BSTreeRemoveR(BSTreeNode** tree, KeyType key);
void CheckWord(BSTreeNode** tree, KeyType key);
实现一个汉译字典,_key为键存放英文,value存放汉语意思;按strcmp的比较,使用搜索二叉树结构存放数据;
判断一个单词拼写是否正确很简单,在已存放的数据中查找,如果找到为正确,反之错误。
//以下实现代码
BSTreeNode* BuyBSTreeNode(KeyType key, ValueType value){
BSTreeNode* node=(BSTreeNode*)malloc(sizeof(BSTreeNode));
assert(node);
node->_left=NULL;
node->_right=NULL;
node->_key=key;
node->_value=value;
}
int BSTreeInsertR(BSTreeNode** pptree, KeyType key, ValueType value){
if(*pptree == NULL){
*pptree=BuyBSTreeNode(key,value); //pptree指向当前空孩子,为其赋一节点
return 0;
}
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 -1;
}
BSTreeNode* BSTreeFindR(BSTreeNode* tree, KeyType key){
if(tree==NULL)
return NULL;
if(strcmp(tree->_key,key)==0){
return tree;
}
else if(strcmp(tree->_key,key)>0){
return BSTreeFindR(tree->_left, key);
}
else{
return BSTreeFindR(tree->_right, key);
}
}
int BSTreeRemoveR(BSTreeNode** pptree, KeyType key){
BSTreeNode* del;
if(*pptree == NULL){
return -1;
}
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.left empty
//2.right empty
//3.l and r isnt empty
BSTreeNode* cur = *pptree;
if((*pptree)->_left == NULL){
*pptree = cur->_right;
}
else if((*pptree)->_right == NULL){
*pptree = cur->_left;
}
else{
BSTreeNode* parent=cur;
BSTreeNode* sub = cur->_right;
while(sub->_left){
sub=sub->_left;
}
cur->_key=sub->_key;
return BSTreeRemoveR(&(cur->_right),sub->_key);
}
return 0;
}
}
void CheckWord(BSTreeNode* tree,KeyType key){
if(BSTreeFindR(tree,key))
printf("%s 拼写正确\n",key);
else
printf("%s 拼写错误\n",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);
printf("lit: %p\n", BSTreeFindR(tree, "lit"));
printf("list: %p\n", BSTreeFindR(tree, "list"));
BSTreeRemoveR(&tree, "list");
printf("list: %p\n", BSTreeFindR(tree, "list"));
CheckWord(tree,"tree");
CheckWord(tree,"hash");
CheckWord(tree,"list");
CheckWord(tree,"asdsd");
};
统计出每个异常IP出现了多少次,只要将value做为重复出现的次数即可
以下为实现代码
typedef char* KeyType;
typedef int ValueType; //存放重复出现的次数
typedef struct BSTreeNode
{
struct BSTreeNode* _left;
struct BSTreeNode* _right;
KeyType _key;
ValueType _value;
}BSTreeNode;
BSTreeNode* BuyBSTreeNode(KeyType key) ;
int BSTreeInsertR(BSTreeNode** tree, KeyType key, ValueType value);
BSTreeNode* BSTreeFindR(BSTreeNode* tree, KeyType key);
int BSTreeRemoveR(BSTreeNode** tree, KeyType key);
//以下实现代码
BSTreeNode* BuyBSTreeNode(KeyType key){
BSTreeNode* node=(BSTreeNode*)malloc(sizeof(BSTreeNode));
assert(node);
node->_left=NULL;
node->_right=NULL;
node->_key=key;
node->_value=1;
}
int BSTreeInsertR(BSTreeNode** pptree, KeyType key){
if(*pptree == NULL){
*pptree=BuyBSTreeNode(key); //pptree指向当前空孩子,为其赋一节点
return 0;
}
if(strcmp((*pptree)->_key,key)>0){
return BSTreeInsertR(&(*pptree)->_left,key);
}
else if(strcmp((*pptree)->_key,key)<0){
return BSTreeInsertR(&(*pptree)->_right,key);
}
else {
(*pptree)->_value++;
return 1;
}
}
BSTreeNode* BSTreeFindR(BSTreeNode* tree, KeyType key){
if(tree==NULL)
return NULL;
if(strcmp(tree->_key,key)==0){
return tree;
}
else if(strcmp(tree->_key,key)>0){
return BSTreeFindR(tree->_left, key);
}
else{
return BSTreeFindR(tree->_right, key);
}
}
int BSTreeRemoveR(BSTreeNode** pptree, KeyType key){
if(*pptree == NULL){
return -1;
}
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.left empty
//2.right empty
//3.l and r isnt empty
BSTreeNode* cur = *pptree;
if((*pptree)->_left == NULL){
*pptree = cur->_right;
}
else if((*pptree)->_right == NULL){
*pptree = cur->_left;
}
else{
BSTreeNode* parent=cur;
BSTreeNode* sub = cur->_right;
while(sub->_left){
sub=sub->_left;
}
cur->_key=sub->_key;
return BSTreeRemoveR(&(cur->_right),sub->_key);
}
return 0;
}
}
void TestBSTreeISP() {
BSTreeNode* tree = NULL;
BSTreeInsertR(&tree, "102.100.01");
BSTreeInsertR(&tree, "102.100.12");
BSTreeInsertR(&tree, "102.100.01");
BSTreeInsertR(&tree, "102.100.35");
BSTreeInsertR(&tree, "102.100.65");
BSTreeInsertR(&tree, "102.100.35");
BSTreeInsertR(&tree, "102.100.35");
printf("102.100.01 %d\n", BSTreeFindR(tree, "102.100.01")->_value);
printf("102.100.12 %d\n", BSTreeFindR(tree, "102.100.12")->_value);
printf("102.100.35 %d\n", BSTreeFindR(tree, "102.100.35")->_value);
printf("102.100.65 %d\n", BSTreeFindR(tree, "102.100.65")->_value);
printf("01: %p\n", BSTreeFindR(tree, "102.100.01"));
printf("102.100.65: %p\n", BSTreeFindR(tree, "102.100.65"));
BSTreeRemoveR(&tree, "102.100.65");
printf("102.100.65: %p\n", BSTreeFindR(tree, "102.100.65"));
};