C++树的实现

 C++树的实现

STL里面没有提供容器树的模板实现,自已写一个:
Tree.h

//tree.h 头文件 #include <list> #include <algorithm> using namespace std; struct TreeNode; //定义一个结构体原型 classTree; //定义一个类原型 classIterator; //定义一个类原型 typedef list<TreeNode*> List; //重命名一个节点链表 TreeNode* clone(TreeNode*,List&,TreeNode*);//Clone复制函数 struct TreeNode{ int_data; //数据 TreeNode* _parent; //父节点 List_children; //子节点 TreeNode(int,TreeNode*); //构造函数 void SetParent(TreeNode&); //设置父节点 void InsertChildren(TreeNode&); //插入子节点 }; classTree{ public: //下面是构造器和运算符重载 Tree(); //默认构造函数 Tree(constTree&); //复制构造函数 Tree(constint); //带参数构造函数 Tree(constint,constlist<Tree*>&);//带参数构造函数 ~Tree(); //析构函数 Tree& operator=(constTree&); //=符号运算符重载 bool operator==(constTree&); //==符号运算符重载 bool operator!=(constTree&); //!=符号运算符重载 //下面是成员函数 void Clear(); //清空 boolIsEmpty()const; //判断是否为空 intSize()const; //计算节点数目 intLeaves(); //计算叶子数 intRoot()const; //返回根元素 intHeight(); //计算树的高度 //下面是静态成员函数 static boolIsRoot(Iterator); //判断是否是根 static boolisLeaf(Iterator); //判断是否是叶子 static IteratorParent(Iterator); //返回其父节点 static intNumChildren(Iterator); //返回其子节点数目 //跌代器函数 Iteratorbegin(); //Tree Begin Iteratorend(); //Tree End friend classIterator; //Iterator SubClass private: list<TreeNode*> _nodes; //节点数组 list<TreeNode*>::iteratorLIt; //一个节点迭代器 intheight(TreeNode*); intlevel(TreeNode*,Iterator); }; //This is TreeSub Class Iterator classIterator{ private: Tree* _tree; //Tree data list<TreeNode*>::iterator_lit; //List Iterator public: Iterator(); //默认构造函数 Iterator(constIterator&); //复制构造函数 Iterator(Tree*,TreeNode*); //构造函数 Iterator(Tree*,list<TreeNode*>::iterator);//构造函数 //运算符重载 void operator=(constIterator&); //赋值运算符重载 bool operator==(constIterator&); //关系运算符重载 bool operator!=(constIterator&); //关系运算符重载 Iterator& operator++(); //前缀++运算符 Iterator operator++(int); //后缀++运算符 int operator*()const; //获得节点信息 bool operator!(); //赋值运算符重载 typedef list<TreeNode*>::iteratorList; friend classTree; };  

Tree.cpp

//tree.cpp 实现文件 #include "Tree.h" //***** 下面是对于TreeNode结构体的定义实现*****/// TreeNode::TreeNode(inttype= 0,TreeNode* Parent = 0){ _data = type; _parent = Parent; } void TreeNode::SetParent(TreeNode& node){ _parent = &node; } void TreeNode::InsertChildren(TreeNode& node){ TreeNode* p = &node; _children.push_back(p); } //***** 下面是对于Tree类的定义实现*****/// Tree::Tree(){ } Tree::Tree(constinttype){ _nodes.push_back(new TreeNode(type)); } Tree::Tree(constTree& t){ if(t._nodes.empty())return; clone(t._nodes.front(),_nodes,0); } Tree::Tree(constinttype,constlist<Tree*>& lit){ TreeNode* root = new TreeNode(type);//建立根节点 _nodes.push_back(root);//放入树中 list<Tree*>::const_iteratorit; for(it = lit.begin();it!=lit.end();it++){ if(!((*it)->_nodes.empty())){//如果当前节点元素不为空 Tree* tp = newTree(**it); TreeNode* p = tp->_nodes.front(); root->_children.push_back(p); //设置根的子节点 p->_parent = root; //设置节点的父节点为根 list<TreeNode*>::iteratorlit1 = tp->_nodes.begin(); list<TreeNode*>::iteratorlit2 = tp->_nodes.end(); list<TreeNode*>::iteratorlit3 = _nodes.end(); _nodes.insert(lit3,lit1,lit2); } } } Tree::~Tree(){ for(list<TreeNode*>::iteratorit = _nodes.begin();it!=_nodes.end();it++){ delete* it; } } Tree& Tree::operator =(constTree & t){ Clear(); Tree* p = newTree(t); _nodes = p->_nodes; return *this; } boolTree::operator ==(constTree& t){ if(_nodes.size()!=t._nodes.size()){ return false; } list<TreeNode*>::iteratorit = _nodes.begin(); list<TreeNode*>::const_iterator_it = t._nodes.begin(); while(it!=_nodes.end()&&_it!=t._nodes.end()){ if((*it)->_data!=(*_it)->_data){ return false; } it++; _it++; } return true; } boolTree::operator !=(constTree& t){ if(_nodes.size()!=_nodes.size()){ return true; } else{ list<TreeNode*>::iteratorit = _nodes.begin(); list<TreeNode*>::const_iterator_it = t._nodes.begin(); while(it!=_nodes.end()&&_it!=t._nodes.end()){ if((*it)->_data!=(*_it)->_data){ return true; } it++; _it++; } return false; } } void Tree::Clear(){ for(list<TreeNode*>::iteratorit = _nodes.begin();it!=_nodes.end();it++){ delete* it; } _nodes.clear(); } boolTree::IsEmpty()const{ return _nodes.empty(); } intTree::Size()const{ return (int)_nodes.size(); } intTree::Leaves(){ inti = 0; list<TreeNode*>::iteratorit = _nodes.begin(); while(it!=_nodes.end()){ if((*it)->_children.size()==0){ i++; } it++; } return i; } intTree::Height(){ if(_nodes.size()!=0){ TreeNode* TNode = _nodes.front(); return height(TNode); } else{ return -1; //判断为空树 } } intTree::height(TreeNode* node){ if(!node){ return -1; } else{ list<TreeNode*> plist = node->_children; if(plist.size()==0){ return 0; } inthA = 0; for(list<TreeNode*>::iteratorit = plist.begin();it!=plist.end();it++){ inthB = height(*it); if(hB>hA){ hA = hB; } } return hA+1; } } IteratorTree::begin(){ return Iterator(this,_nodes.begin()); } IteratorTree::end(){ return Iterator(this,_nodes.end()); } intTree::Root()const{ return (*_nodes.begin())->_data; } boolTree::IsRoot(Iteratorit){ TreeNode p = *it; if(p._parent == 0){ return true; } return false; } boolTree::isLeaf(Iteratorit){ TreeNode p = *it; if(p._children.size() == 0){ return true; } return false; } IteratorTree::Parent(Iteratorit){ TreeNode p = *it; Tree* t = it._tree; IteratorIte(t,p._parent); return Ite; } intTree::NumChildren(Iteratorit){ TreeNode p = *it; return (int)p._children.size(); } //***** 下面是对于Tree::Iterator类的定义实现*****/// Iterator::Iterator(){ } Iterator::Iterator(constIterator& it){ _tree = it._tree; _lit = it._lit; } Iterator::Iterator(Tree* t, TreeNode* n){ _tree = t; list<TreeNode*>& nodes = _tree->_nodes; _lit = find(nodes.begin(),nodes.end(),n);//<algorithm> Members } Iterator::Iterator(Tree * t, list<TreeNode*>::iteratorlt){ _tree = t; _lit = lt; } void Iterator::operator =(constIterator& it){ _tree = it._tree; _lit = it._lit; } boolIterator::operator ==(constIterator & it){ return _tree == it._tree && _lit == it._lit; } boolIterator::operator !=(constIterator & it){ return _tree != it._tree || _lit != it._lit; } Iterator& Iterator::operator ++(){ ++_lit; return *this; } IteratorIterator::operator ++(int){ Iteratorit(*this); ++_lit; return it; } intIterator::operator *() const{ return ((*_lit)->_data); } boolIterator::operator !(){ return _lit == _tree->_nodes.end(); } //Clone函数 TreeNode* clone(TreeNode* node,List& nodes,TreeNode* nodep){ TreeNode* cp = new TreeNode(node->_data,nodep); nodes.push_back(cp); List& l = node->_children; List& cl = cp->_children; for(list<TreeNode*>::iteratorlt = l.begin();lt!=l.end();lt++){ cl.push_back(clone(*lt,nodes,cp)); } return cp; } 

转载于:https://www.cnblogs.com/xieyunc/archive/2009/04/30/2793611.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加密文件忘记密码怎么解密_MyBatis 配置文件 用户密码加密存储

properties配置文件一般是使用properties保存配置文件内容,然后在mybatis配置文件中进行读取在resource文件下新建db.properties文件内容如下# 数据库配置文件 driver com.mysql.cj.jdbc.Driver url jdbc:mysql:// /mybatis username password 然后,接着把文件放入源码包…

PHP,如何防止同一用户同一时间多次登录

转载链接&#xff1a;http://blog.sina.com.cn/s/blog_4832ea590101djnp.html PHP&#xff0c;如何防止同一用户同一时间多次登录&#xff1f; 创建表 username password sessionId 张三 123456 ksw9dkw9ksl92w3 备注&#xff1a;用户…

科技前沿智能创新 2019北京智能家居 全屋智能博览会

2019北京智能家居大型展览会 2019北京全屋智能家居博览会报道布展&#xff1a;2019年6月26日-27日 展会开幕&#xff1a;2019年6月28日上午9&#xff1a;00时展会交易&#xff1a;2019年6月28日-30日 展会撤展&#xff1a;2019年6月30日下午14&#xff1a;00时 展览会在北京市政…

java 容器_我也来聊聊,JAVA容器与迭代器

java的容器与迭代器是一个老生常谈的话题了。本文旨在与大家分享一些关于双向链表与迭代器的运用小技巧&#xff0c;并希望本篇文章的内容能够在项目中给你带来帮助。Stack与LinkedListStack是一个LIFO(后进先出)的容器。若要在java中定义一个Stack应该怎么办&#xff1f;也许你…

VS2005调试时变慢解决办法

vs2005生成代码以及调试运行时&#xff0c;如果设置断点系统运行非常缓慢&#xff0c;从网上查阅一些资料后解决&#xff1a; 主要解决办法是&#xff1a; 打开VS2005菜单项"工具"---->"导入导出设置"----->"重置所有设置" 本文参考:http:…

apache目录的访问控制

转载链接&#xff1a;http://blog.sina.com.cn/s/blog_7be8a2150100trml.html 1.根目录的访问控制 DocumentRoot "/var/www/html" <Directory /> Options FollowSymLinks AllowOverride None </Directory> 解释一下&#xff1a; <Dir…

广东高院驳回快播对深圳市场监管局2.6亿罚款案上诉

雷帝网 乐天 12月29日报道据广东高院官方微信消息&#xff0c;广东省高级人民法院对深圳市快播科技有限公司&#xff08;简称快播&#xff09;诉深圳市市场监督管理局&#xff08;简称市场监管局&#xff09;著作权行政处罚纠纷案作出终审宣判&#xff0c;驳回上诉&#xff0c;…

【Vegas原创】恢复Oracle Package的笨方法

imp没有恢复package的参数&#xff0c;所以&#xff0c;只能用笨办法&#xff1a;rowsn&#xff0c;只导入表结构和物件。 步骤&#xff1a; 1&#xff0c;dbca新建一个test数据库&#xff1b; 2&#xff0c;新增user&#xff0c;表空间&#xff0c;给user赋予权限 3&#xff0…

python enumerate函数_关于python中enumerate和zip函数的用法及举例

关于python中enumerate和zip函数的用法及举例关于enumerate函数&#xff1a;enumerate函数可以同时返回列表或元组等可迭代对象的下标和内容&#xff0c;但实际上&#xff0c;enumerate函数实际返回的是一个enumerate类型的可迭代对象&#xff0c;下面是用法举例&#xff1a;se…

php 解析xml 的四种方法(转)

转载链接&#xff1a;http://www.cnblogs.com/likwo/archive/2011/08/24/2151793.html XML处理是开发过程中经常遇到的&#xff0c;PHP对其也有很丰富的支持&#xff0c;本文只是对其中某几种解析技术做简要说明&#xff0c;包括&#xff1a;Xml parser, SimpleXML, XMLReader,…

Golang 微服务系列 go-kit(Log,Metrics,Tracing)

go-kit Log & Metrics & Tracing 微服务监控3大核心 Log & Metrics & Tracing Log Log 模块源码有待分析&#xff08;分析完再补上&#xff09; Metrics 主要是封装 Metrics 接口&#xff0c;及各个 Metrics(Prometheus,InfluxDB,StatsD,expvar) 中间件的封装。…

GDI+

载解压GDI开发包&#xff1b; 2&#xff0e; 正确设置include & lib 目录&#xff1b; 3&#xff0e; stdafx.h 添加&#xff1a; #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include <gdiplus.h> 4&#xff0e; 程序中添加GDI的包含文件gdip…

shell 练习3

1、编写脚本/root/bin/createuser.sh&#xff0c;实现如下功能&#xff1a;使用一个用户名做为参数&#xff0c;如果指定参数的用户存在&#xff0c;就显示其存在&#xff0c;否则添加之&#xff1b;显示添加的用户的id号等信息2、编写脚本/root/bin/yesorno.sh&#xff0c;提示…

HTML5文件实现拖拽上传

转载链接&#xff1a;http://www.cnblogs.com/caonidayecnblogs/archive/2010/09/09/1821925.html 通过HTML的文件API &#xff0c;Firefox、Chrome等浏览器已经支持从操作系统直接拖拽文件&#xff0c;并上传到服务器。 相对于使用了十多年的HTML表单&#xff0c;这是一个革命…

两个数组结果相减_学点算法(三)——数组归并排序

今天来学习归并排序算法。分而治之归并算法的核心思想是分而治之&#xff0c;就是将大问题转化为小问题&#xff0c;在解决小问题的基础上&#xff0c;再去解决大问题。将这句话套用到排序中&#xff0c;就是将一个大的待排序区间分为小的待排序区间&#xff0c;对小的排序区间…

python实习生面试题_大数据分析实习生面试题库

原标题&#xff1a;大数据分析实习生面试题库大数据分析是一个有吸引力的领域&#xff0c;因为它不仅有利可图&#xff0c;而且您有机会从事有趣的项目&#xff0c;而且您总是在学习新事物。如果您想从头开始&#xff0c;请查看大数据分析实习生面试题库以准备面试要点。大数据…

JavaScript编程语言 基础 (1)

问题&#xff1a;什么是web前端前端&#xff1a;指界面&#xff0c;计算机&#xff08;PC&#xff09;软件桌面的界面&#xff1b; 计算机端的浏览器界面&#xff1b; 移动端的软件&#xff08;app&#xff09;界面&#xff1b; 移动端的浏览器界面。HtmlcssJavaScript 使用网页…

shell结合expect写的批量scp脚本工具

转载链接&#xff1a;http://www.jb51.net/article/34005.htm expect用于自动化地执行linux环境下的命令行交互任务&#xff0c;例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具&#xff0c;定义在scp过程中可能遇到的情况&#xff0c;然后编写相应的处理语…

ASP记数器

这两天有好几个老的ASP网站要改&#xff0c;其中有要求加记数器&#xff0c;为图简单&#xff0c;就用文本文件的形式存储记数。以前用ifream的形式嵌入&#xff0c;不能很好的控制记数器显示的风格&#xff0c;现在改进了一下&#xff0c;可以很好的与嵌入板块风格结合了。把做…

php利用openssl实现RSA非对称加密签名

转载链接&#xff1a;http://liuxufei.com/weblog/jishu/376.html 1. 先用php生成一对公钥和私钥 $res openssl_pkey_new(); openssl_pkey_export($res,$pri); $d openssl_pkey_get_details($res); $pub $d[key]; var_dump($pri,$pub); 2. 保存好自己的私钥&#xff0c;把公…