这个问题需要单独处理
发布时间:2025-06-24 20:18:53 作者:北方职教升学中心 阅读量:492
那假设 it 到达6节点上呢,6的右为空,但是根据中序遍历的顺序,6的父亲1已经访问过了。但是在本篇文章中由于展示等的原因,无法按照上面的步骤。其中包括对 Find 和 Insert 函数的改造,特别是 Insert,因为在 map 里实现 operator[] 时需要依赖 Insert 函数。因此插入数据时不能直接比较,要在 set 和 map 类中实现一个 KeyOfT 的仿函数,以便单独获取两个类型中的 key 数据。
map 中 pair 的 first 不能修改,second 可以修改,在 pair 的第一个参数前加 const 即可。
在改造红黑树的过程中,我大概归纳了以下几个需要重点解决的问题:
(1) 对红黑树节点的改造。
说明:如果大家要自己动手实现封装,可以按照上面五个问题的流程进行实现。
MySet.h
#include"RBTree.h"namespace cc{template<class K>class set {// 获取 set 里面的 keystructSetOfT{constK&operator()(constK&key){returnkey;}};public:typedeftypename RBTree<K,constK,SetOfT>::Iterator iterator;typedeftypename RBTree<K,constK,SetOfT>::ConstIterator const_iterator;iterator begin(){return_t.Begin();}iterator end(){return_t.End();}const_iterator begin()const{return_t.Begin();}const_iterator end()const{return_t.End();}pair<iterator,bool>insert(constK&key){return_t.Insert(key);}iterator find(constK&key){return_t.Find(key);}private:RBTree<K,constK,SetOfT>_t;};}//使用 const 迭代器 voidPrint(constcc::set<int>&s){autoit =s.begin();while(it !=s.end()){cout <<*it <<" ";++it;}cout <<endl;}//测试代码voidTest_set(){//int a[] = { 8, 3, 1, 10, 6, 4, 7, 14, 13 };inta[]={16,3,7,11,9,26,18,14,15};cc::set<int>s;for(autoe :a)s.insert(e);for(autoe :s)cout <<e <<" ";cout <<endl;Print(s);}
七,map 的封装实现
map的底层结构就是红黑树,因此在map中直接封装一棵红黑树,然后将其接口包装下即可。
为了解决 set 中 key 值不能修改的问题,在传给 RBTree 的第二个模板参数前加 const 即可。
MyMap.h
#include"RBTree.h"namespace cc{template<class K,class V>class map {//获取 pair 中的 keystructMapOfT{constK&operator()(constpair<K,V>&kv){returnkv.first;}};public:typedeftypename RBTree<K,pair<constK,V>,MapOfT>::Iterator iterator;typedeftypename RBTree<K,pair<constK,V>,MapOfT>::ConstIterator const_iterator;iterator begin(){return_t.Begin();}iterator end(){return_t.End();}const_iterator begin()const{return_t.Begin();}const_iterator end()const{return_t.End();}pair<iterator,bool>insert(constpair<K,V>&kv){return_t.Insert(kv);}iterator find(constK&key){return_t.Find(key);}//给一个key,返回value的引用V&operator[](constK&key){pair<iterator,bool>ret =insert(make_pair(key,V()));returnret.first->second;}private:RBTree<K,pair<constK,V>,MapOfT>_t;};}//测试代码voidTest_map(){cc::map<string,string>dict;dict.insert({"left","左边"});dict.insert({"right","右边"});dict.insert({"insert","插入"});dict["left"]="剩余,左边";cc::map<string,string>::iterator it =dict.begin();while(it !=dict.end()){//it->first += 'x'; //errit->second +='y';//okcout <<it->first <<":"<<it->second <<endl;++it;}cout <<endl;}