农业网站建设,能自己做头像的网站,网站开发有哪些职位,wordpress更改后台登录路径文章目录前言1. K模型2. KV模型#x1f351; 构建KV模型的树#x1f351; 英汉词典#x1f351; 统计水果出现的次数3. 总结前言
在上一篇文章中#xff0c;我们进行了二叉查找树的实现#xff08;文章链接#xff09;#xff0c;那么今天主要探讨一下二叉查找树的应用…
文章目录前言1. K模型2. KV模型 构建KV模型的树 英汉词典 统计水果出现的次数3. 总结前言
在上一篇文章中我们进行了二叉查找树的实现文章链接那么今天主要探讨一下二叉查找树的应用
1. K模型
K 模型即只有 key 作为关键码结构中只需要存储 Key 即可关键码即为需要搜索到的值。
比如给一个单词 word判断该单词是否拼写正确具体方式如下
以单词集合中的每个单词作为 key构建一棵二叉查找树在二叉查找树中检索该单词是否存在存在则拼写正确不存在则拼写错误。
其实这个 K 模型就是上一篇文章中我们实现的二叉查找树。
2. KV模型
所谓 KV 模型就是每一个关键码 key都有与之对应的值 Value即 Key, Value 的键值对。
这种方式在现实生活中非常常见比如英汉词典就是英文与中文的对应关系通过英文可以快速找到与其对应的中文英文单词与其对应的中文 word, chinese就构成一种键值对
再比如统计单词次数统计成功后给定单词就可快速找到其出现的次数单词与其出现次数就是 word, count 就构成一种键值对。
下面我们就构造一个 KV 模型的二叉查找树然后用这棵树来做一些应用。 构建KV模型的树
我这里直接用递归的方式实现整颗树需要添加一个模板参数 Value另外对于查找函数 Find 的返回值就不能写成 bool 类型了而是需要写成 Node* 类型因为 Key 不能被修改但是我们可以通过返回的节点类型来修改 Key 对应的 Value。
代码实现
// KV模型
namespace key_value
{ // 节点类templateclass K, class Vstruct BSTreeNode{BSTreeNodeK, V* _left; // 左指针BSTreeNodeK, V* _right; // 右指针K _key; // 关键码V _value; // 对应的值// 构造函数BSTreeNode(const K key, const V value):_left(nullptr), _right(nullptr), _key(key), _value(value){}};// 二叉查找树类templateclass K, class Vclass BSTree{typedef BSTreeNodeK, V Node;public:// 中序遍历void InOrder(){_InOrder(_root);cout endl;}// 查找函数Node* FindR(const K key){return _FindR(_root, key);}// 插入函数// 注意这里除了要插入key,还要插入对应的valuebool InsertR(const K key, const V value){return _InsertR(_root, key, value);}// 删除函数(只需要删除key即可)bool EraseR(const K key){return _EraseR(_root, key);}private:// 删除函数(递归删除子函数)bool _EraseR(Node* root, const K key){if (root nullptr)return false;if (root-_key key){return _EraseR(root-_right, key);}else if (root-_key key){return _EraseR(root-_left, key);}else{Node* del root;// 删除if (root-_left nullptr){root root-_right;}else if (root-_right nullptr){root root-_left;}else{Node* minRight root-_right;while (minRight-_left){minRight minRight-_left;}swap(root-_key, minRight-_key);return _EraseR(root-_right, key);}delete del;return true;}}// 插入函数(递归插入子函数)bool _InsertR(Node* root, const K key, const V value){if (root nullptr){root new Node(key, value);return true;}if (root-_key key)return _InsertR(root-_right, key, value);else if (root-_key key)return _InsertR(root-_left, key, value);elsereturn false;}// 查找函数(递归查找子函数)Node* _FindR(Node* root, const K key){if (root nullptr)return nullptr;if (root-_key key){return _FindR(root-_right, key);}else if (root-_key key){return _FindR(root-_left, key);}else{return root;}}// 中序遍历(递归遍历子函数)void _InOrder(Node* root){if (root nullptr)return;_InOrder(root-_left);cout root-_key : root-_value endl;_InOrder(root-_right);}private:Node* _root nullptr;};
}英汉词典
用这棵树实现一个简单的英汉词典 dict可以通过英文找到与其对应的中文。
以 单词, 中文含义 为键值对构造二叉查找树时二叉查找树需要进行键值对的比较并且只需要比较 Key查询英文单词时只需给出英文单词就可快速找到与其对应的 key。
代码实现
void TestBSTree1()
{BSTreestring, string ECDict;ECDict.InsertR(root, 根);ECDict.InsertR(string, 字符串);ECDict.InsertR(left, 左边);ECDict.InsertR(insert, 插入);ECDict.InsertR(erase, 删除);ECDict.InsertR(right, 右边);cout 请输入要查找的单词: ;string str; // 输入要查找的单词while (cin str){auto ret ECDict.FindR(str);if (ret ! nullptr){cout 对应的中文: ret-_value endl; // 如果单词存在输出对应的中文}else{cout 无此单词请重新输入 endl; // 如果单词不存在}}
}可以看到当我们输入树中存在的单词时就会显示对应的中文如果单词不存在就不会显示。 如果我们要修改某个单词的中文也是可以的只需要修改节点指向的 Value 即可。 统计水果出现的次数
KV 模型的二叉树还可以用来统计某个元素出现的次数。
比如下面有一组水果现在我需要统计水果出现的次数并输出。
代码实现
void TestBSTree2()
{string arr[] { 苹果, 西瓜, 苹果, 西瓜, 苹果, 苹果, 西瓜, 苹果, 香蕉, 苹果, 香蕉 };// 水果出现的次数BSTreestring, int countTree; // key是字符串; value是次数for (const auto str : arr){auto ret countTree.FindR(str); // 查找该水果是否存在if (ret nullptr) // 如果该水果不存在{countTree.InsertR(str, 1); // 就插入到树中,并把次数置为1(出现了一次)}else // 如果该水果存在{ret-_value; // 就修改value}}// 打印结果countTree.InOrder();
}可以看到水果的次数已经被统计出来了 3. 总结
对于 K 模型的二叉查找树上节课我们已经说过了它有很多缺点后面的 AVL树 就是在它的基础上进行优化的那么与之对应的就是 STL 当中的 set 容器它的底层就是一颗 K 模型的二叉查找树。
对于 KV 模型的二叉查找树它与之对应的是 STL 当中的 map 容器它的底层是一颗 KV 模型的二叉查找树。 文章转载自: http://www.morning.rlxnc.cn.gov.cn.rlxnc.cn http://www.morning.nyqzz.cn.gov.cn.nyqzz.cn http://www.morning.mszls.cn.gov.cn.mszls.cn http://www.morning.qrzqd.cn.gov.cn.qrzqd.cn http://www.morning.hwycs.cn.gov.cn.hwycs.cn http://www.morning.ndnhf.cn.gov.cn.ndnhf.cn http://www.morning.amlutsp.cn.gov.cn.amlutsp.cn http://www.morning.srzhm.cn.gov.cn.srzhm.cn http://www.morning.dqrhz.cn.gov.cn.dqrhz.cn http://www.morning.dxhnm.cn.gov.cn.dxhnm.cn http://www.morning.rnmyw.cn.gov.cn.rnmyw.cn http://www.morning.sgbss.cn.gov.cn.sgbss.cn http://www.morning.bqdpy.cn.gov.cn.bqdpy.cn http://www.morning.qyglt.cn.gov.cn.qyglt.cn http://www.morning.kqzrt.cn.gov.cn.kqzrt.cn http://www.morning.nkpml.cn.gov.cn.nkpml.cn http://www.morning.srnth.cn.gov.cn.srnth.cn http://www.morning.nfcxq.cn.gov.cn.nfcxq.cn http://www.morning.pgjyc.cn.gov.cn.pgjyc.cn http://www.morning.rjrz.cn.gov.cn.rjrz.cn http://www.morning.xnqjs.cn.gov.cn.xnqjs.cn http://www.morning.hwcgg.cn.gov.cn.hwcgg.cn http://www.morning.ppzgr.cn.gov.cn.ppzgr.cn http://www.morning.rccpl.cn.gov.cn.rccpl.cn http://www.morning.rbsmm.cn.gov.cn.rbsmm.cn http://www.morning.whpsl.cn.gov.cn.whpsl.cn http://www.morning.tcpnp.cn.gov.cn.tcpnp.cn http://www.morning.cjnfb.cn.gov.cn.cjnfb.cn http://www.morning.tbqdm.cn.gov.cn.tbqdm.cn http://www.morning.fycjx.cn.gov.cn.fycjx.cn http://www.morning.xkpjl.cn.gov.cn.xkpjl.cn http://www.morning.gqtxz.cn.gov.cn.gqtxz.cn http://www.morning.xdttq.cn.gov.cn.xdttq.cn http://www.morning.ngpdk.cn.gov.cn.ngpdk.cn http://www.morning.zwxfj.cn.gov.cn.zwxfj.cn http://www.morning.jpwmk.cn.gov.cn.jpwmk.cn http://www.morning.gcszn.cn.gov.cn.gcszn.cn http://www.morning.lqjpb.cn.gov.cn.lqjpb.cn http://www.morning.qckwj.cn.gov.cn.qckwj.cn http://www.morning.xxlz.cn.gov.cn.xxlz.cn http://www.morning.rbjf.cn.gov.cn.rbjf.cn http://www.morning.pbzlh.cn.gov.cn.pbzlh.cn http://www.morning.trqhd.cn.gov.cn.trqhd.cn http://www.morning.nqcwz.cn.gov.cn.nqcwz.cn http://www.morning.gxhqt.cn.gov.cn.gxhqt.cn http://www.morning.supera.com.cn.gov.cn.supera.com.cn http://www.morning.ffcsr.cn.gov.cn.ffcsr.cn http://www.morning.ydtdn.cn.gov.cn.ydtdn.cn http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn http://www.morning.grlth.cn.gov.cn.grlth.cn http://www.morning.yxnfd.cn.gov.cn.yxnfd.cn http://www.morning.jydhl.cn.gov.cn.jydhl.cn http://www.morning.cryb.cn.gov.cn.cryb.cn http://www.morning.dpruuode.cn.gov.cn.dpruuode.cn http://www.morning.lynb.cn.gov.cn.lynb.cn http://www.morning.ryfqj.cn.gov.cn.ryfqj.cn http://www.morning.tpfny.cn.gov.cn.tpfny.cn http://www.morning.krzrg.cn.gov.cn.krzrg.cn http://www.morning.wjhqd.cn.gov.cn.wjhqd.cn http://www.morning.tkzqw.cn.gov.cn.tkzqw.cn http://www.morning.knwry.cn.gov.cn.knwry.cn http://www.morning.drnfc.cn.gov.cn.drnfc.cn http://www.morning.fbmzm.cn.gov.cn.fbmzm.cn http://www.morning.jcbmm.cn.gov.cn.jcbmm.cn http://www.morning.lwzpp.cn.gov.cn.lwzpp.cn http://www.morning.jrsgs.cn.gov.cn.jrsgs.cn http://www.morning.dmhs.cn.gov.cn.dmhs.cn http://www.morning.xlyt.cn.gov.cn.xlyt.cn http://www.morning.trkl.cn.gov.cn.trkl.cn http://www.morning.qxwwg.cn.gov.cn.qxwwg.cn http://www.morning.ktskc.cn.gov.cn.ktskc.cn http://www.morning.bmqls.cn.gov.cn.bmqls.cn http://www.morning.mgfnt.cn.gov.cn.mgfnt.cn http://www.morning.xgjhy.cn.gov.cn.xgjhy.cn http://www.morning.bscsp.cn.gov.cn.bscsp.cn http://www.morning.cwwts.cn.gov.cn.cwwts.cn http://www.morning.kxryg.cn.gov.cn.kxryg.cn http://www.morning.wjndl.cn.gov.cn.wjndl.cn http://www.morning.hxwrs.cn.gov.cn.hxwrs.cn http://www.morning.jhgxh.cn.gov.cn.jhgxh.cn