一个简单的多叉树实现:
- 利用迭代器方便地构建树,
- 可以递归输出,前序,后序。
- 利用栈实现输出。
- 销毁树只能后序遍历
类的定义:
- #include <iostream>
- #include <string>
- #include <vector>
- #include <stack>
- #include <cassert>
- using namespace std;
- template<class T>
- class htree_node{
- public:
- typedef htree_node<T> node_type;
- htree_node()
- :parent(0),format(" ")
- {}
- htree_node(const T& x)
- :name(x), parent(0), format(" ")
- {}
- ~htree_node()
- {}
- T name;
-
- std::string format;
- node_type *parent;
- std::vector<node_type*> children;
- };
- template<class T, class Container = htree_node<T> >
- class htree{
- protected:
- typedef Container tree_node;
- public:
- htree()
- :root(0)
- { Init(); }
- htree(tree_node *node)
- :root(node)
- { Init(); }
- ~htree(){
- destroy(root);
- }
-
- class iterator{
- public:
- iterator()
- : _node(0)
- , skip_current_children_(false)
- {
- skip_children();
- }
- iterator(tree_node *node)
- : _node(node)
- , skip_current_children_(false)
- {
- skip_children();
- }
- ~iterator()
- {}
- T& operator*() const
- {
- return _node->name;
- }
- T* operator->() const
- {
- return &(_node->name);
- }
- tree_node* get()
- {
- return _node;
- }
-
- iterator begin() const
- {
- return iterator(_node);
- }
-
- iterator end() const
- {
- return iterator( _find_end(_node) );
- }
-
- tree_node *_node;
- protected:
- bool skip_current_children_;
- void skip_children()
- {
- skip_current_children_=true;
- }
- tree_node* _find_end(tree_node* current) const
- {
- int pos = current->children.size()-1;
- if( pos<0 )
- return (current);
-
-
- else
- _find_end(current->children[pos]);
- }
- };
- public:
-
- iterator insert(iterator& position, const T& x)
- {
- tree_node *tmp = new tree_node(x);
- position._node->children.push_back(tmp);
- tmp->parent = position._node;
- return iterator(tmp);
- }
-
- void post_recurs_render(tree_node* some, unsigned recurs_level)
- {
- for (unsigned i = 0; i < some->children.size(); i++)
- post_recurs_render(some->children[i], recurs_level+1);
- for (int i = 0; i<recurs_level; i++)
- cout << " ";
- cout << some->name << endl;
- }
-
- void pre_recurs_render(tree_node* some, unsigned recurs_level)
- {
- for (int i = 0; i<recurs_level; i++)
- cout << " ";
- cout << some->name << endl;
- for (unsigned i = 0; i < some->children.size(); i++)
- pre_recurs_render(some->children[i], recurs_level+1);
- }
-
-
-
- void recurs_render(tree_node* some)
- {
- std::string temp;
- temp = form_stack.top() + some->format;
- form_stack.push(temp);
-
- cout << temp;
- cout << some->name;
- cout << endl;
- for (unsigned i = 0; i < some->children.size(); i++)
- recurs_render(some->children[i]);
- form_stack.pop();
- }
- tree_node *root;
- private:
- void Init(){
- form_stack.push(std::string(" "));
- };
- void destroy(tree_node *some)
- {
- #define SAFE_DELETE(p) {if(p){delete p; p=NULL;}}
-
- for (unsigned i = 0; i < some->children.size(); i++)
- destroy(some->children[i]);
- SAFE_DELETE(some);
- }
- std::stack<std::string> form_stack;
- };
下面是main函数里的测试代码:
- int main()
- {
-
- int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
- tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
- _CrtSetDbgFlag( tmpFlag );
- typedef htree_node<string> node_type;
- typedef htree<string> tree_type;
- node_type *one = new node_type("one");
-
- tree_type::iterator iter(one);
- tree_type tr1(one);
- tree_type::iterator two = tr1.insert(iter, "two");
- tree_type::iterator three = tr1.insert(iter, "three");
- tr1.insert(two, "apple");
- tr1.insert(two, "banana");
- tr1.insert(two, "peach");
- tr1.insert(three, "china");
- tr1.insert(three, "england");
-
-
- tr1.recurs_render(tr1.root);
- cout << "--------" << endl;
-
-
- tr1.pre_recurs_render(tr1.root, 1);
- cout << "--------" << endl;
-
- tr1.post_recurs_render(tr1.root, 1);
- cout << "--------" << endl;
-
- cout << (* (iter.end()) ) << endl;
- return 0;
- }
最终输出结果:
- one
- two
- apple
- banana
- peach
- three
- china
- england
- --------
- one
- two
- apple
- banana
- peach
- three
- china
- england
- --------
- apple
- banana
- peach
- two
- china
- england
- three
- one
- --------
- england
#pragma once#include <list>#include <algorithm>using namespace std;struct TreeNode; class Tree; class Iterator; typedef list<TreeNode*> List; TreeNode* clone(TreeNode*, List&, TreeNode*);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(); Iterator end(); friend class Iterator; private: list<TreeNode*> _nodes; list<TreeNode*>::iterator LIt; int height(TreeNode*); int level(TreeNode*,Iterator);};class Iterator{private: Tree* _tree; list<TreeNode*>::iterator _lit; public: 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;};
#include "stdafx.h"#include "Tree.h"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(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();}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);}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();}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;}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。