搜索二叉树面试题

一、面试题

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;
	}
}

3、写一个测试(test.c)让代码跑起来并加以验证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值