搜索二叉树的应用

1. 判断一个单词是否拼写正确
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")); 
}; 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Victor.Chang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值