搜索二叉树之字典实现
利用搜索二叉树判断一个单词是否拼写正确:
假设把所有单词都按照搜索树的性质插入到搜索二叉树中,我们判断一个单词拼写是否正确就是在树中查找该单词是否存在(查找key是否存在)。
/*****************************************
*Date:2018年3月26日14:42:54
*Author: Meng
*WebSite:msyci.com
*QQ:3515955122
*****************************************/# include <stdio.h>
# include <stdlib.h>
# include <string.h>
#include<assert.h>typedef char* KeyType;
typedef char* ValueType;typedef struct BSTreeNode
{struct BSTreeNode* _left;struct BSTreeNode* _right;KeyType _key;ValueType _value;
}BSTreeNode;BSTreeNode *BuyTreeNode(KeyType x,ValueType value ) //创建节点
{BSTreeNode *node = (BSTreeNode*)malloc(sizeof(BSTreeNode));assert(node);node->_key = x;node->_left = NULL;node->_right = NULL;node->_value = value;return node;
}//插入、查找函数
int BSTreeNodeInsertR(BSTreeNode **tree,KeyType key, ValueType value) //搜索树的插入
{int tmp = 0;if(*tree == NULL){*tree = BuyTreeNode(key,value); return 0;}tmp = strcmp((*tree)->_key,key);if (tmp>0)return BSTreeNodeInsertR(&(*tree)->_left,key,value);else if (tmp<0)return BSTreeNodeInsertR(&(*tree)->_right,key,value);elsereturn -1;
}BSTreeNode* BSTreeNodeFindR(BSTreeNode* tree, KeyType key) //查找
{int tmp = 0;if(!tree){return NULL;}tmp = strcmp(tree->_key, key);if(tmp > 0){return BSTreeNodeFindR(tree->_left, key);}else if (tmp < 0){return BSTreeNodeFindR(tree->_right, key);}else{return tree;}
}void TestApplication()
{BSTreeNode *tree = NULL;BSTreeNodeInsertR(&tree,"China","中国");BSTreeNodeInsertR(&tree,"score","成绩");BSTreeNodeInsertR(&tree,"char","字符");BSTreeNodeInsertR(&tree,"int","×××");BSTreeNodeInsertR(&tree,"float","浮点型");printf("%s \n", BSTreeNodeFindR(tree,"char")->_value);printf("%s \n", BSTreeNodeFindR(tree,"int")->_value);printf("%s \n", BSTreeNodeFindR(tree,"float")->_value);printf("%s \n", BSTreeNodeFindR(tree,"China")->_value);printf("%s \n", BSTreeNodeFindR(tree,"score")->_value);printf("%p \n", BSTreeNodeFindR(tree,"double"));}int main(void)
{TestApplication();char c = getchar();return 0;
}
运行结果:
实现简单的中英文字典
/*****************************************
*Date:2018年3月26日15:35:07
*Author: Meng
*WebSite:msyci.com
*QQ:3515955122
*****************************************/# include <stdio.h>
# include <stdlib.h>
# include <string.h>
#include<assert.h>typedef char* KeyType;
typedef char* ValueType;typedef struct BSTreeNode
{struct BSTreeNode* _left;struct BSTreeNode* _right;KeyType _key;ValueType _value;
}BSTreeNode;BSTreeNode *BuyTreeNode(KeyType x,ValueType value ) //创建节点
{BSTreeNode *node = (BSTreeNode*)malloc(sizeof(BSTreeNode));assert(node);node->_key = x;node->_left = NULL;node->_right = NULL;node->_value = value;return node;
}//插入、查找函数
int BSTreeNodeInsertR(BSTreeNode **tree,KeyType key, ValueType value) //搜索树的插入
{int tmp = 0;if(*tree == NULL){*tree = BuyTreeNode(key,value); return 0;}tmp = strcmp((*tree)->_key,key);if (tmp>0)return BSTreeNodeInsertR(&(*tree)->_left,key,value);else if (tmp<0)return BSTreeNodeInsertR(&(*tree)->_right,key,value);elsereturn -1;
}BSTreeNode* BSTreeNodeFindR(BSTreeNode* tree, KeyType key) //查找
{int tmp = 0;if(!tree){return NULL;}tmp = strcmp(tree->_key, key);if(tmp > 0){return BSTreeNodeFindR(tree->_left, key);}else if (tmp < 0){return BSTreeNodeFindR(tree->_right, key);}else{return tree;}
}void TestApplication()
{BSTreeNode *tree = NULL;BSTreeNodeInsertR(&tree,"China","中国");BSTreeNodeInsertR(&tree,"score","成绩");BSTreeNodeInsertR(&tree,"char","字符");BSTreeNodeInsertR(&tree,"int","×××");BSTreeNodeInsertR(&tree,"float","浮点型");printf("%s \n", BSTreeNodeFindR(tree,"char")->_value);printf("%s \n", BSTreeNodeFindR(tree,"int")->_value);printf("%s \n", BSTreeNodeFindR(tree,"float")->_value);printf("%s \n", BSTreeNodeFindR(tree,"China")->_value);printf("%s \n", BSTreeNodeFindR(tree,"score")->_value);printf("%p \n", BSTreeNodeFindR(tree,"double"));}int main(void)
{TestApplication();char c = getchar();return 0;
}
运行结果:
搜索二叉树之字典实现相关推荐
- 链表问题15——将搜索二叉树转换成双向链表
题目 将一颗搜索二叉树按照中序遍历(左-中-右)的顺序,变成一个有序的双向链表. 所谓的先序遍历.中序遍历和后序遍历都针对的是中间的节点也就是根节点,先序遍历为中-左-右,后序遍历为左-右-中 思路 ...
- 判断一个数列是不是搜索二叉树后续遍历输出的结果
剑平面阿里被问到这个,刚开始画了下看有什么性质,乱蒙了几个都被推翻了,初始感觉就是要O(n)的,因为印象中BST的构树都可以O(nlogn)搞定.然后剑平说最后一个数肯定是根节点,一下反应过来了,就是 ...
- 调整搜索二叉树中两个错误的节点
一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回.已知二叉树中所有节点的 值都不一样,给定二叉树的头节点 head,返回一个长度为 ...
- 判断一棵二叉树是否为搜索二叉树、完全二叉树、平衡二叉树(java)
平衡二叉树的解法:主要是求出二叉树的高度,若根节点的左子树的高度与右子树的高度差小于等于1,则表示该二叉树为平衡二叉树 public static class Node{public int valu ...
- 找到二叉树中符合搜索二叉树条件的最大拓扑结构
找到二叉树中符合搜索二叉树条件的最大拓扑结构 给定一棵二叉树的头节点 head,已知所有节点的值都不一样,返回其中最大的.且符合搜索二叉树 条件的拓扑结构的节点数.这里的拓扑结构是指,你可以在二叉树中 ...
- 寻找搜索二叉树中两个错误的节点
题目:一颗二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这颗二叉树不再是搜索二叉树,请找到两个错误节点并返回.已知二叉树中所有节点的值都不一样,给定二叉树的头节点head,返回一个长度为2 ...
- 通过有序数组生成平衡搜索二叉树
题目:给定一个有序数组sortArr,已知其中没有重复值,用这个有序数组生成一颗平衡搜索二叉树,并且该搜索二叉树中序遍历的结果与sortArr一致 思路:用有序数组最中间的数生成搜索二叉树的头节点,然 ...
- 根据后续数组重建搜索二叉树
题目: 给定一个整型数组arr,已知其中没有重复值,判断arr是否可能是节点值类型为整型的搜索二叉树后续遍历的结果 思路:根据搜索二叉树的性质,比后续数组最后一个元素值小的数组会在数组的左边,比数组最 ...
- 将搜索二叉树转换成双向链表
题目: 对二叉树的节点来说,有本身的值域,有指向左孩子和右孩子的两个指针:对双向链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针.在结构上,两种结构有相似性,现在有一棵搜索二叉树,请将 ...
最新文章
- C#学习视频分享与开发技术QQ交流群
- TortoiseGit入门(图文教程) Git,Github,puttygen,SSH
- java的classpath是什么_JAVA初学者classpath设置情况是什么?
- 【每日一题】8月25日题目精讲 XOR-pyramid
- windows资源管理器已停止工作后,使用命令提示窗口拷贝文件和运行exe程序
- java 布局实例,HarmonyOS Java UI之StackLayout布局示例
- 2013-8-9练习[多种方法制作一个计时器]
- wordpress发布文章错误:此响应不是合法的JSON响应
- 本周ASP.NET英文技术文章推荐[03/18 - 03/24]
- LVS 实现负载均衡
- 图片拼图效果——ps
- mysql分组后查询条数_MySQL分组后,如何统计记录条数
- 什么是PMI指数?PMI指数是什么意思? 如何计算PMI指数?
- 编程艺术——软件设计模式SOLID原则
- vc中cout如何解除fixed控制_C++ fixed用法详解
- VR专业名字解释_羊豆豆_新浪博客
- android 断点下载的实现,Android实现断点下载的方法
- 大学计算机专业哪个学校最好,计算机专业:最好的7所大学!也是全中国“最难考”的大学!...
- 电机驱动电路之H桥基本知识---Trinamic电机驱动芯片
- DocuCentre SC2020 打印机连接