日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++树的实现

發(fā)布時間:2023/12/10 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++树的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?C++樹的實現(xiàn)

STL里面沒有提供容器樹的模板實現(xiàn),自已寫一個:
Tree.h

//tree.h 頭文件 #include <list> #include <algorithm> using namespace std; struct TreeNode; //定義一個結構體原型 classTree; //定義一個類原型 classIterator; //定義一個類原型 typedef list<TreeNode*> List; //重命名一個節(jié)點鏈表 TreeNode* clone(TreeNode*,List&,TreeNode*);//Clone復制函數(shù) struct TreeNode{ int_data; //數(shù)據 TreeNode* _parent; //父節(jié)點 List_children; //子節(jié)點 TreeNode(int,TreeNode*); //構造函數(shù) void SetParent(TreeNode&); //設置父節(jié)點 void InsertChildren(TreeNode&); //插入子節(jié)點 }; classTree{ public: //下面是構造器和運算符重載 Tree(); //默認構造函數(shù) Tree(constTree&); //復制構造函數(shù) Tree(constint); //帶參數(shù)構造函數(shù) Tree(constint,constlist<Tree*>&);//帶參數(shù)構造函數(shù) ~Tree(); //析構函數(shù) Tree& operator=(constTree&); //=符號運算符重載 bool operator==(constTree&); //==符號運算符重載 bool operator!=(constTree&); //!=符號運算符重載 //下面是成員函數(shù) void Clear(); //清空 boolIsEmpty()const; //判斷是否為空 intSize()const; //計算節(jié)點數(shù)目 intLeaves(); //計算葉子數(shù) intRoot()const; //返回根元素 intHeight(); //計算樹的高度 //下面是靜態(tài)成員函數(shù) static boolIsRoot(Iterator); //判斷是否是根 static boolisLeaf(Iterator); //判斷是否是葉子 static IteratorParent(Iterator); //返回其父節(jié)點 static intNumChildren(Iterator); //返回其子節(jié)點數(shù)目 //跌代器函數(shù) Iteratorbegin(); //Tree Begin Iteratorend(); //Tree End friend classIterator; //Iterator SubClass private: list<TreeNode*> _nodes; //節(jié)點數(shù)組 list<TreeNode*>::iteratorLIt; //一個節(jié)點迭代器 intheight(TreeNode*); intlevel(TreeNode*,Iterator); }; //This is TreeSub Class Iterator classIterator{ private: Tree* _tree; //Tree data list<TreeNode*>::iterator_lit; //List Iterator public: Iterator(); //默認構造函數(shù) Iterator(constIterator&); //復制構造函數(shù) Iterator(Tree*,TreeNode*); //構造函數(shù) Iterator(Tree*,list<TreeNode*>::iterator);//構造函數(shù) //運算符重載 void operator=(constIterator&); //賦值運算符重載 bool operator==(constIterator&); //關系運算符重載 bool operator!=(constIterator&); //關系運算符重載 Iterator& operator++(); //前綴++運算符 Iterator operator++(int); //后綴++運算符 int operator*()const; //獲得節(jié)點信息 bool operator!(); //賦值運算符重載 typedef list<TreeNode*>::iteratorList; friend classTree; }; ?

Tree.cpp

//tree.cpp 實現(xiàn)文件 #include "Tree.h" //***** 下面是對于TreeNode結構體的定義實現(xiàn)*****/// 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類的定義實現(xiàn)*****/// 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);//建立根節(jié)點 _nodes.push_back(root);//放入樹中 list<Tree*>::const_iteratorit; for(it = lit.begin();it!=lit.end();it++){ if(!((*it)->_nodes.empty())){//如果當前節(jié)點元素不為空 Tree* tp = newTree(**it); TreeNode* p = tp->_nodes.front(); root->_children.push_back(p); //設置根的子節(jié)點 p->_parent = root; //設置節(jié)點的父節(jié)點為根 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類的定義實現(xiàn)*****/// 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函數(shù) 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

總結

以上是生活随笔為你收集整理的C++树的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。