• 搜索二叉树的应用


    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 拼写正确
    ",key);
    	else
    		printf("%s 拼写错误
    ",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
    ", BSTreeFindR(tree, "tree")->_value); 
    	printf("%s
    ", BSTreeFindR(tree, "return")->_value); 
    	printf("%s
    ", BSTreeFindR(tree, "hash")->_value); 
    	printf("%s
    ", BSTreeFindR(tree, "list")->_value); 
    	printf("lit:   %p
    ", BSTreeFindR(tree, "lit")); 
    	printf("list:  %p
    ", BSTreeFindR(tree, "list")); 
    	BSTreeRemoveR(&tree, "list");
    	printf("list:  %p
    ", 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
    ", BSTreeFindR(tree, "102.100.01")->_value); 
    	printf("102.100.12  %d
    ", BSTreeFindR(tree, "102.100.12")->_value); 
    	printf("102.100.35  %d
    ", BSTreeFindR(tree, "102.100.35")->_value); 
    	printf("102.100.65  %d
    ", BSTreeFindR(tree, "102.100.65")->_value); 
    
    	printf("01:   %p
    ", BSTreeFindR(tree, "102.100.01")); 
    	printf("102.100.65:  %p
    ", BSTreeFindR(tree, "102.100.65")); 
    	BSTreeRemoveR(&tree, "102.100.65");
    	printf("102.100.65:  %p
    ", BSTreeFindR(tree, "102.100.65")); 
    }; 


  • 相关阅读:
    scala IDE for Eclipse开发Spark程序
    RedHat6.5安装Spark单机
    RedHat6.5安装Spark集群
    Spark任务提交jar包依赖解决方案
    本地开发spark代码上传spark集群服务并运行
    Maven3.5.0安装与配置+Eclipse应用
    MAVEN Scope使用
    Maven下载项目依赖jar包和使用方法
    maven中把依赖的JAR包一起打包
    Maven+Eclipse+SparkStreaming+Kafka整合
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615368.html
Copyright © 2020-2023  润新知