一、面试题
1、判断一个单词是否拼写正确;
直接将所有单词入搜索二叉树,判断单词是否正确时只需搜索二叉树中是否存在该单词即可。
2、请模拟实现一个简单的中英互译的字典;
本题利用搜索二叉树的key、value模式。如果是英译汉时,key存放英文,value存放中文,再根据英文找到结点所在,查找结点的value即可得到中文;英译汉时,key存放中文,value存放英文,再根据中文找到结点所在,查找结点的value即可得到中文。
3、log文件中有许多异常重复的IP地址,请统计出每个异常IP出现了多少次。
也是利用搜索二叉树的key、value模式。key存放异常IP,而value为int计数,每找到一个将该IP所在的结点的value加1,最后遍历每个结点的value即可得到每个异常IP出现的次数。
二、源代码
1、binsearch.h
#ifndef _BINSEARCH__H_
#define _BINSEARCH__H_
#include "stdio.h"
#include "malloc.h"
#include "assert.h"
#include "string.h"
typedef char* KeyType;
typedef char* ValueType; //统计异常IP将char*变为int*计数
typedef struct BSTreeNode
{
struct BSTreeNode* _left;
struct BSTreeNode* _right;
KeyType _key;
ValueType _value;
}BSTreeNode, *pBSTreeNode;
pBSTreeNode BuyBSTreeNode(KeyType key, ValueType value);
int BSTreeInsertR(pBSTreeNode* tree, KeyType key, ValueType value);
pBSTreeNode BSTreeFindR(pBSTreeNode tree, KeyType key);
int BSTreeRemoveR(pBSTreeNode* tree, KeyType key);
#endif
2、binsearch.c
#include "binsearch.h"
//创建结点
pBSTreeNode BuyBSTreeNode(KeyType key, ValueType value)
{
pBSTreeNode node = (pBSTreeNode)malloc(sizeof(BSTreeNode));
node->_key = key;
node->_value = value;
node->_left = NULL;
node->_right = NULL;
return node;
}
//插入
int BSTreeInsertR(pBSTreeNode *tree, KeyType key, ValueType value)
{
assert(tree);
if (*tree == NULL)
{
*tree = BuyBSTreeNode(key, value);
return 0;
}
if (strcmp((*tree)->_key , key)>0)
return BSTreeInsertR(&(*tree)->_left, key, value);
else if (strcmp((*tree)->_key, key)<0)
return BSTreeInsertR(&(*tree)->_right, key, value);
else
{
//(*tree)->_value++;
return -1;
}
}
//查找
pBSTreeNode BSTreeFindR(pBSTreeNode tree, KeyType key)
{
if (tree == NULL)
return NULL;
if (strcmp((*tree)._key, key)>0)
return BSTreeFindR(tree->_left, key);
else if (strcmp((*tree)._key, key)<0)
return BSTreeFindR(tree->_right, key);
else
{
//tree->_value++;(统计异常IP用)
return tree;
}
}
//删除
int BSTreeRemoveR(pBSTreeNode *tree, KeyType key)
{
assert(tree);
if (*tree == NULL)
return -1;
if (strcmp((*tree)->_key, key)>0)
return BSTreeRemoveR(&(*tree)->_left, key);
else if (strcmp((*tree)->_key, key)<0)
return BSTreeRemoveR(&(*tree)->_right, key);
else
{
if ((*tree)->_left == NULL)
*tree = (*tree)->_right;
else if ((*tree)->_right == NULL)
*tree = (*tree)->_left;
else
{
pBSTreeNode left = (*tree)->_left;
while (left->_right != NULL)
left = left->_right;
(*tree)->_key = left->_key;
(*tree)->_value = left->_value;
return BSTreeRemoveR(&(*tree)->_left, left->_key);
}
return 0;
}
}