要抛弃原来C的思想,用C++标准的东西写一颗树
主要找到以下两个不同的代码实现: 先研究第一个 一个简单的多叉树实现: - 利用迭代器方便地构建树,
- 可以递归输出,前序,后序。
- 利用栈实现输出。
- 销毁树只能后序遍历
类的定义: - #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
C++树的实现 STL里面没有提供容器树的模板实现,自已写一个: Tree.h
-
-
- #include <list>
- #include <algorithm>
- using namespace std;
-
- struct TreeNode;
- classTree;
- classIterator;
- typedef list<TreeNode*> List;
-
- TreeNode* clone(TreeNode*,List&,TreeNode*);
-
- struct TreeNode
-
-
-
-
-
-
- ;
-
- classTree
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ;
-
-
- classIterator
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ;
Tree.cpp
|