Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1576856
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类:

2009-10-14 12:36:27

一个简单的多叉树实现:

  1. 利用迭代器方便地构建树,
  2. 可以递归输出,前序,后序。
  3. 利用栈实现输出。
  4. 销毁树只能后序遍历

类的定义:

  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6.   
  7. using namespace std;  
  8.   
  9. template<class T>  
  10. class htree_node{  
  11. public:  
  12.     typedef htree_node node_type;  
  13.   
  14.     htree_node()  
  15.         :parent(0),format("  ")  
  16.     {}  
  17.     htree_node(const T& x)        
  18.         :name(x), parent(0), format("  ")  
  19.     {}  
  20.   
  21.     ~htree_node()  
  22.     {}  
  23.   
  24.     T name;  
  25.     //默认为两个空格  
  26.     std::string format;  
  27.   
  28.     node_type *parent;  
  29.     std::vector children;  
  30. };  
  31.   
  32. template<class T, class Container = htree_node >  
  33. class htree{  
  34. protected:  
  35.     typedef Container tree_node;          
  36. public:  
  37.     htree()  
  38.         :root(0)  
  39.     { Init(); }  
  40.     htree(tree_node *node)  
  41.         :root(node)  
  42.     { Init(); }  
  43.     ~htree(){  
  44.         destroy(root);  
  45.     }  
  46.   
  47.     //pre_order_iterator  
  48.     class iterator{  
  49.     public:  
  50.         iterator()  
  51.             : _node(0)  
  52.             , skip_current_children_(false)  
  53.         {  
  54.             skip_children();  
  55.         }  
  56.         iterator(tree_node *node)  
  57.             : _node(node)  
  58.             , skip_current_children_(false)  
  59.         {  
  60.             skip_children();  
  61.         }  
  62.   
  63.         ~iterator()  
  64.         {}  
  65.   
  66.         T& operator*() const  
  67.         {  
  68.             return _node->name;  
  69.         }  
  70.         T* operator->() const  
  71.         {  
  72.             return &(_node->name);  
  73.         }  
  74.         tree_node* get()  
  75.         {  
  76.             return _node;  
  77.         }  
  78.   
  79.         //开始位置  
  80.         iterator begin() const  
  81.         {  
  82.             return iterator(_node);  
  83.         }  
  84.         //结束位置  const????  
  85.         iterator end() const  
  86.         {  
  87.             return iterator( _find_end(_node) );  
  88.         }  
  89.           
  90.         tree_node *_node;  
  91.     protected:  
  92.         bool skip_current_children_;  
  93.         void         skip_children()  
  94.         {  
  95.             skip_current_children_=true;  
  96.         }  
  97.         tree_node* _find_end(tree_node* current) const  
  98.         {  
  99.             int pos = current->children.size()-1;  
  100.             if( pos<0 )  
  101.                 return (current);  
  102.                 //这里返回iterator会被析构掉,临时对象  
  103.             //从最后一个孩子找起,  
  104.             else  
  105.                 _find_end(current->children[pos]);  
  106.         }  
  107.     };  
  108. public:  
  109.     //注意传position的引用  
  110.     iterator insert(iterator& position, const T& x)       
  111.     {  
  112.         tree_node *tmp = new tree_node(x);  
  113.   
  114.         position._node->children.push_back(tmp);  
  115.         tmp->parent = position._node;  
  116.   
  117.         return iterator(tmp);  
  118.     }  
  119.   
  120.     //后序递归输出  
  121.     void post_recurs_render(tree_node* some, unsigned recurs_level)  
  122.     {  
  123.         for (unsigned i = 0; i < some->children.size(); i++)  
  124.             post_recurs_render(some->children[i], recurs_level+1);  
  125.         for (int i = 0; i
  126.             cout << "  ";  
  127.   
  128.         cout << some->name << endl;  
  129.     }  
  130.     //先序递归输出  
  131.     void pre_recurs_render(tree_node* some, unsigned recurs_level)  
  132.     {  
  133.         for (int i = 0; i
  134.             cout << "  ";  
  135.   
  136.         cout << some->name << endl;  
  137.   
  138.         for (unsigned i = 0; i < some->children.size(); i++)  
  139.             pre_recurs_render(some->children[i], recurs_level+1);  
  140.     }  
  141.   
  142.   
  143.     //利用stack  
  144.     //使用Transform格式化输出  
  145.     void recurs_render(tree_node* some)  
  146.     {  
  147.         std::string temp;  
  148.         temp = form_stack.top() + some->format;  
  149.         form_stack.push(temp);  
  150.           
  151.         cout << temp;  
  152.         cout << some->name;  
  153.         cout << endl;  
  154.         for (unsigned i = 0; i < some->children.size(); i++)  
  155.             recurs_render(some->children[i]);  
  156.   
  157.         form_stack.pop();  
  158.     }  
  159.     tree_node *root;  
  160.   
  161. private:  
  162.     void Init(){  
  163.         form_stack.push(std::string(" "));  
  164.     };  
  165.   
  166.     void destroy(tree_node *some)  
  167.     {  
  168.         #define SAFE_DELETE(p) {if(p){delete p; p=NULL;}}  
  169.         //后序删除  
  170.         for (unsigned i = 0; i < some->children.size(); i++)  
  171.             destroy(some->children[i]);  
  172.         SAFE_DELETE(some);  
  173.     }  
  174.   
  175.     std::stack form_stack;  
  176. };  
 

下面是main函数里的测试代码:

  1. int main()   
  2. {   
  3.     //for detecting the memory leaks  
  4.     int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );   
  5.     tmpFlag |= _CRTDBG_LEAK_CHECK_DF;   
  6.     _CrtSetDbgFlag( tmpFlag );  
  7.   
  8.     typedef htree_node node_type;  
  9.     typedef htree tree_type;  
  10.   
  11.     node_type *one = new node_type("one");  
  12.       
  13.     tree_type::iterator iter(one);  
  14.     tree_type tr1(one);  
  15.     tree_type::iterator two = tr1.insert(iter, "two");  
  16.     tree_type::iterator three = tr1.insert(iter, "three");  
  17.   
  18.     tr1.insert(two, "apple");  
  19.     tr1.insert(two, "banana");  
  20.     tr1.insert(two, "peach");  
  21.   
  22.     tr1.insert(three, "china");  
  23.     tr1.insert(three, "england");  
  24.       
  25.     //method 1:  
  26.     tr1.recurs_render(tr1.root);  
  27.     cout << "--------" << endl;  
  28.       
  29.     //method 2:   
  30.     tr1.pre_recurs_render(tr1.root, 1);  
  31.     cout << "--------" << endl;  
  32.   
  33.     //method 3:  
  34.     tr1.post_recurs_render(tr1.root, 1);  
  35.     cout << "--------" << endl;  
  36.   
  37.     // test iterator::end() function  
  38.     cout << (* (iter.end()) ) << endl;  
  39.   
  40.     return 0;  
  41. }   
  

最终输出结果:

  1.    one  
  2.      two  
  3.        apple  
  4.        banana  
  5.        peach  
  6.      three  
  7.        china  
  8.        england  
  9. --------  
  10.   one  
  11.     two  
  12.       apple  
  13.       banana  
  14.       peach  
  15.     three  
  16.       china  
  17.       england  
  18. --------  
  19.       apple  
  20.       banana  
  21.       peach  
  22.     two  
  23.       china  
  24.       england  
  25.     three  
  26.   one  
  27. --------  
  28. england 
阅读(660) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~