0.题目
  • 1.假设给你一篇英语文章,又给你一个在这个英语文章中的英语单词,让你检查这个英语单词是否拼写正确。
  • 2.假设给你一篇英语文章,如何才能求出文章中所有单词重复出现的次数呢?
1.思路
  • 1.第一题是key模式,我们可以将这篇英语文章中的所有正确的单词都放在一颗二叉搜索树中,然后在二叉搜索树搜索这个单词,如果在二叉搜索树中,则必然是正确的;如果不在,则是错误的。
  • 2.第二题是key-value模式,我们可以遍历这篇文章,遇到二叉搜索树中没有的,我们就把这个单词给插入,count域为1(用来计数重复出现多少次);如果二叉搜索树中有这个单词,则让它的count++一下

2.代码实现

key模式
由于key模式就是判断一个值是否在一棵二叉搜索树中,对于第一题,我们只需要把二叉搜索树的插入数据的类型该为char*,查找函数等稍微改一下数据类型即可,所有这里贴出二叉搜索树基本操作,总结在我的另一边博客:
https://blog.csdn.net/hansionz/article/details/81985287

key-value模式

/*****************************************************************/
/*key-value模式*/typedef char* BSTKeyType;//key类型(字符串)
typedef int BSTValueType;//value类型(计数用的为整型)
//定义二叉搜索树结点类型
typedef struct BSTKeyValueNode
{BSTKeyType _key;BSTValueType _value;struct BSTKeyValueNode* _left;struct BSTKeyValueNode* _right;
}BSTKeyValueNode;
/**********************************************************************/
/*key-value*/
//创建一个新的结点
BSTKeyValueNode* BuyBSTKeyValueNode(BSTKeyType key,BSTValueType value)
{BSTKeyValueNode* tmp = (BSTKeyValueNode*)malloc(sizeof(BSTKeyValueNode));if (tmp == NULL){perror("use malloc of create");}tmp->_key = (char*)malloc(strlen(key) + 1);strcpy(tmp->_key, key);//字符串(char*)不能直接赋值,要用strcpy拷贝tmp->_value = value;tmp->_left = NULL;tmp->_right = NULL;return tmp;
}
//新插入一个结点(插入成功返回1,失败返回0)
int BSTKVInsert(BSTKeyValueNode** kvroot, BSTKeyType key, BSTValueType value)
{assert(kvroot);BSTKeyValueNode* cur = *kvroot;BSTKeyValueNode* parent = NULL;//用来记录要插入结点的双亲//整棵树为空,插入第一个结点(这里要改变根节点指针的指向,必须要用二级指针)if (*kvroot == NULL){*kvroot = BuyBSTKeyValueNode(key, value);return 1;}//1.找到插入位置while (cur){if (strcmp(cur->_key, key) > 0){parent = cur;cur = cur->_left;}else if (strcmp(cur->_key, key) < 0){parent = cur;cur = cur->_right;}//如果存在相同的数据,则插入失败else{return 0;}}//2.parent为插入结点的双亲,在确定要插入的结点在左还是右,然后直接插入if (strcmp(parent->_key, key) > 0){parent->_left = BuyBSTKeyValueNode(key, value);}else{parent->_right = BuyBSTKeyValueNode(key, value);}return 1;
}
//在二叉树中找一个结点
BSTKeyValueNode* BSTKVFind(BSTKeyValueNode** kvroot, BSTKeyType key)
{assert(kvroot);BSTKeyValueNode* cur = *kvroot;//根据二叉搜索树的性质比较遍历一遍while (cur){if (strcmp(cur->_key, key) > 0){cur = cur->_left;}else if (strcmp(cur->_key, key) < 0){cur = cur->_right;}else{//找到返回它的地址return cur;}}//找不到返回NULLreturn NULL;
}
//中序遍历(方便测试使用)
void BSTKVInorder(BSTKeyValueNode** kvroot)
{assert(kvroot);if (*kvroot == NULL){return;}BSTKVInorder(&(*kvroot)->_left);printf("%s:%d\n", (*kvroot)->_key, (*kvroot)->_value);BSTKVInorder(&(*kvroot)->_right);
}

下边是测试代码

void TestBSKVTree()
{BSTKeyValueNode* kvr = NULL;char str[20] = { '0' };while (1){scanf("%s", str);//输入exit则结束if (strcmp(str, "exit") == 0){break;}BSTKeyValueNode* fnode = BSTKVFind(&kvr, str);//如果二叉搜索树中存在结点,则只改变它的value域,记录次数if (fnode){fnode->_value++;}//不存在,则插入此结点else{BSTKVInsert(&kvr, str, 1);}}//中序遍历看结果BSTKVInorder(&kvr);
}

二叉搜索树的经典应用面试题(keykey-value模式)相关推荐

  1. 二叉搜索树的经典问题

    关于二叉树的简明遍历以及一个非常经典的问题实现,读自<程序员面试攻略>简洁明了的遍历: void PreOrderTraversal(Node root)//先根遍历 {     if(r ...

  2. 面试题整理7 二叉搜索树的后序遍历序列

    <剑指offer>面试题24: 题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. ...

  3. 高度平衡的二叉搜索树基础概念与经典题目(Leetcode题解-Python语言)

    高度平衡的二叉搜索树(平衡二叉树),定义见此Leetbook.简单来说,就是基于相同节点值构建出来的二叉搜索树中高度最小的,即为平衡二叉树(不唯一).有 N 个节点的平衡二叉搜索树,它的高度是 log ...

  4. [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

    [问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...

  5. 阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点

    为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总 ...

  6. 【IT笔试面试题整理】二叉搜索树转换为双向链表

    [试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...

  7. 剑指offer——面试题63:二叉搜索树的第k个结点

    剑指offer--面试题63:二叉搜索树的第k个结点 Solution1: 20180916重做 /* struct TreeNode {int val;struct TreeNode *left;s ...

  8. 【重点】剑指offer——面试题27:二叉搜索树与双向链表

    剑指offer--面试题27:二叉搜索树与双向链表 Solution1: 这是书上的代码,要理解好最近几道题,对指针的操作比较多... class Solution { public:TreeNode ...

  9. 剑指offer——面试题24:二叉搜索树的后序遍历序列

    剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...

最新文章

  1. GNN与Transformer融合促进药物发现 | 2022几何图机器学习展望
  2. 创建面板对象Java,从PNG图像或Java面板创建PDF
  3. SpringBoot使用thymeleaf
  4. Linux java集成安装环境,Linux下Java环境安装
  5. Android fillViewPort属性用法
  6. oracle中master实例,Oracle10g/11g RAC数据库中的Master实例、Owner实例和Past Image的概念PART2...
  7. QT每日一练day14:QFontDialog字体对话框
  8. 好几个div(元素)找到最后一个
  9. PHP无限极分类巧用引用生成树
  10. 变量名可以是python的关键字_python – 如何使用关键字作为变量名?
  11. sql server 用户创建与权限管理
  12. uniapp - 接入科大讯飞语音评测
  13. oracle中如何模糊匹配,oracle中的截取,模糊匹配小结
  14. 一些FORK函数的例子
  15. 国产芯片WiFi物联网智能插座—电源功能设计
  16. 怎么使用QQ音乐api搭建个人音乐站点
  17. FAT32、exFAT、NTFS
  18. iOS根据相册图片识别条形码、二维码以及脸部特征
  19. C-11 Problem H: 开宝箱2
  20. python 基础语法--print,input,open的内置函数的操作

热门文章

  1. android实现歌词的自动滚动
  2. Playframework介绍
  3. 漫谈国内外Android生态:华为发布的 HMS 服务,对 Mate30 系列无法搭载 Google GMS 的补偿有多大(本人原创)
  4. 【USACO1.3.3】最棒的回文
  5. IC前端数字验证导学
  6. Service starting has been prevented by iaware or trustsbase sInfo ServiceInfo 解决方法
  7. 做移动网站还是移动应用程序?
  8. 2.3、云计算FusionCompute存储虚拟化
  9. Hbuilder 运行到手机上找不到真机 解决办法
  10. vscode最常用插件