C++ 树形结构
来源:互联网 发布:linux解压tar.bz2文件 编辑:程序博客网 时间:2024/06/10 15:50
转载自:http://blog.csdn.net/stephenxu111/article/details/2446382
修改了此篇文章中 代码显示的一点小问题。
///Tree.h 文件#pragma once#include <list>#include <algorithm>using namespace std;struct TreeNode; //定义一个结构体原形class Tree; //定义一个类原形class Iterator; //定义一个类原形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& ); //插入子节点};class Tree{public: //下面是构造器和运算符重载 Tree(); //默认构造函数 Tree(const Tree&); //复制构造函数 Tree(const int); //带参数构造函数 Tree(const int,const list<Tree*>&); //带参数构造函数 ~Tree(); //析构函数 Tree& operator=(const Tree&); //=符号运算符重载 bool operator==(const Tree&); //==符号运算符重载 bool operator!=(const Tree&); //!=符号运算符重载 //下面是成员函数 void Clear(); //清空 bool IsEmpty()const; //判断是否为空 int Size()const; //计算节点数目 int Leaves(); //计算叶子数 int Root()const; //返回根元素 int Height(); //计算树的高度 //下面是静态成员函数 static bool IsRoot(Iterator); //判断是否是根 static bool isLeaf(Iterator); //判断是否是叶子 static Iterator Parent(Iterator); //返回其父节点 static int NumChildren(Iterator); //返回其子节点数目 //跌代器函数 Iterator begin(); //Tree Begin Iterator end(); //Tree End friend class Iterator; //Iterator SubClassprivate: list<TreeNode*> _nodes; //节点数组 list<TreeNode*>::iterator LIt; //一个节点迭代器 int height(TreeNode*); int level(TreeNode*,Iterator);};//This is TreeSub Class Iteratorclass Iterator{private: Tree* _tree; //Tree data list<TreeNode*>::iterator _lit; //List Iteratorpublic: Iterator(); //默认构造函数 Iterator(const Iterator&); //复制构造函数 Iterator(Tree*,TreeNode*); //构造函数 Iterator(Tree*,list<TreeNode*>::iterator); //构造函数 //运算符重载 void operator=(const Iterator&); //赋值运算符重载 bool operator==(const Iterator&); //关系运算符重载 bool operator!=(const Iterator&); //关系运算符重载 Iterator& operator++(); //前缀++运算符 Iterator operator++(int); //后缀++运算符 int operator*()const; //获得节点信息 bool operator!(); //赋值运算符重载 typedef list<TreeNode*>::iterator List; friend class Tree;};
///Tree.cpp 文件#include "stdafx.h"#include "Tree.h"//***** 下面是对于TreeNode结构体的定义实现*****///TreeNode::TreeNode(int type = 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(const int type) { _nodes.push_back(new TreeNode(type));}Tree::Tree(const Tree& t) { if (t._nodes.empty())return; clone(t._nodes.front(), _nodes, 0);}Tree::Tree(const int type, const list<Tree*>& lit) { TreeNode* root = new TreeNode(type);//建立根节点 _nodes.push_back(root);//放入树中 list<Tree*>::const_iterator it; for (it = lit.begin(); it != lit.end(); it++) { if (!((*it)->_nodes.empty())) {//如果当前节点元素不为空 Tree* tp = new Tree(**it); TreeNode* p = tp->_nodes.front(); root->_children.push_back(p); //设置根的子节点 p->_parent = root; //设置节点的父节点为根 list<TreeNode*>::iterator lit1 = tp->_nodes.begin(); list<TreeNode*>::iterator lit2 = tp->_nodes.end(); list<TreeNode*>::iterator lit3 = _nodes.end(); _nodes.insert(lit3, lit1, lit2); } }}Tree::~Tree() { for (list<TreeNode*>::iterator it = _nodes.begin(); it != _nodes.end(); it++) { delete* it; }}Tree& Tree::operator =(const Tree & t) { Clear(); Tree* p = new Tree(t); _nodes = p->_nodes; return *this;}bool Tree::operator ==(const Tree& t) { if (_nodes.size() != t._nodes.size()) { return false; } list<TreeNode*>::iterator it = _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;}bool Tree::operator !=(const Tree& t) { if (_nodes.size() != _nodes.size()) { return true; } else { list<TreeNode*>::iterator it = _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*>::iterator it = _nodes.begin(); it != _nodes.end(); it++) { delete* it; } _nodes.clear();}bool Tree::IsEmpty()const { return _nodes.empty();}int Tree::Size()const { return (int)_nodes.size();}int Tree::Leaves() { int i = 0; list<TreeNode*>::iterator it = _nodes.begin(); while (it != _nodes.end()) { if ((*it)->_children.size() == 0) { i++; } it++; } return i;}int Tree::Height() { if (_nodes.size() != 0) { TreeNode* TNode = _nodes.front(); return height(TNode); } else { return -1; //判断为空树 }}int Tree::height(TreeNode* node) { if (!node) { return -1; } else { list<TreeNode*> plist = node->_children; if (plist.size() == 0) { return 0; } int hA = 0; for (list<TreeNode*>::iterator it = plist.begin(); it != plist.end(); it++) { int hB = height(*it); if (hB>hA) { hA = hB; } } return hA + 1; }}Iterator Tree::begin() { return Iterator(this, _nodes.begin());}Iterator Tree::end() { return Iterator(this, _nodes.end());}int Tree::Root()const { return (*_nodes.begin())->_data;}bool Tree::IsRoot(Iterator it) { TreeNode p = *it; if (p._parent == 0) { return true; } return false;}bool Tree::isLeaf(Iterator it) { TreeNode p = *it; if (p._children.size() == 0) { return true; } return false;}Iterator Tree::Parent(Iterator it) { TreeNode p = *it; Tree* t = it._tree; Iterator Ite(t, p._parent); return Ite;}int Tree::NumChildren(Iterator it) { TreeNode p = *it; return (int)p._children.size();}//***** 下面是对于Tree::Iterator类的定义实现*****///Iterator::Iterator() {}Iterator::Iterator(const Iterator& 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*>::iterator lt) { _tree = t; _lit = lt;}void Iterator::operator =(const Iterator& it) { _tree = it._tree; _lit = it._lit;}bool Iterator::operator ==(const Iterator & it) { return _tree == it._tree && _lit == it._lit;}bool Iterator::operator !=(const Iterator & it) { return _tree != it._tree || _lit != it._lit;}Iterator& Iterator::operator ++() { ++_lit; return *this;}Iterator Iterator::operator ++(int) { Iterator it(*this); ++_lit; return it;}int Iterator::operator *() const { return ((*_lit)->_data);}bool Iterator::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*>::iterator lt = l.begin(); lt != l.end(); lt++) { cl.push_back(clone(*lt, nodes, cp)); } return cp;}
阅读全文
0 0
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 组织结构树形结构
- Linux C编写的列出文件树形结构的程序
- Objective-C之平铺导航、标签导航、树形结构导航
- Xcode_7 iOS_9 树形结构导航 Objective-C (17)
- 100行C代码终端打印树形结构
- 数据结构实验: 树形结构及其应用(C语言)
- 树形dp+树形结构总结
- 自定义结构--一般树形结构
- 树形结构的实现
- Window 2008 iis7.5服务器批量导出网站列表技巧
- mac 安装MySQL
- Neuroevolution: A different kind of deep learning
- aarch64-linux-gcc:not found
- JS怎么把字符串数组转换成整型数组
- C++ 树形结构
- 关于抢红包、网络投票
- 直接插入排序c++
- JavaScript
- Hbase 集群部署
- Ubuntu 安装mysql和简单操作
- POJ 3071 Football(概率dp+二进制思想)
- ubuntu16 dnw for tiny4412
- 【Bug修复】内存泄漏--anonymous impleation of android.arch.lifecycle.Observer leaks