| Код | #include <conio.h>
#include <set> #include <iostream> using namespace std; //////////////////////////////////////////////////////////////////////////// template<class ELEM_TYPE> class CTreeElem { private: ELEM_TYPE m_value; set<CTreeElem *> m_children; public: CTreeElem(ELEM_TYPE value): m_value(value) {} ~CTreeElem() { for (set<CTreeElem *>::iterator iter = m_children.begin(); iter != m_children.end(); ++iter) { if (*iter) delete *iter; } m_children.clear(); }
ELEM_TYPE get_value() const { return m_value; }
CTreeElem<ELEM_TYPE> *add_elem(CTreeElem<ELEM_TYPE> *parent, ELEM_TYPE elem_value) { if (parent == this) { CTreeElem<ELEM_TYPE> *new_elem = new CTreeElem<ELEM_TYPE>(elem_value); m_children.insert(new_elem); return new_elem; } set<CTreeElem *>::iterator iter_find = m_children.find(parent); if (iter_find != m_children.end()) return (*iter_find)->add_elem(parent, elem_value); CTreeElem<ELEM_TYPE> *new_elem(NULL); for (set<CTreeElem *>::iterator iter = m_children.begin(); iter != m_children.end(); ++iter) { new_elem = (*iter)->add_elem(parent, elem_value); if (new_elem != NULL) return new_elem; } return new_elem; }
bool del_elem(ELEM_TYPE elem_value) { for (set<CTreeElem *>::iterator iter = m_children.begin(); iter != m_children.end(); ++iter) { if ((*iter)->get_value() == elem_value) { delete *iter; m_children.erase(iter); return true; } if ((*iter)->del_elem(elem_value)) return true; } return false; }
friend ostream &operator<<(ostream &os, const CTreeElem<ELEM_TYPE> &tree_elem) { os<<tree_elem.m_value; if (!tree_elem.m_children.empty()) { os<<"\n |\n "; for (set<CTreeElem *>::const_iterator iter = tree_elem.m_children.begin(); iter != tree_elem.m_children.end(); ++iter) { os<<" "<<*(*iter); } os<<" "<<endl; } return os; } }; //////////////////////////////////////////////////////////////////////////// template<class ELEM_TYPE> class CTree { private: CTreeElem<ELEM_TYPE> *m_root; public: CTree(): m_root(NULL) {} ~CTree() { if (m_root) delete m_root; }
CTreeElem<ELEM_TYPE> *add_elem(CTreeElem<ELEM_TYPE> *parent, ELEM_TYPE elem_value) { if (!m_root) { m_root = new CTreeElem<ELEM_TYPE>(elem_value); return m_root; } else { if (parent == NULL) return NULL; return m_root->add_elem(parent, elem_value); } }
bool del_elem(ELEM_TYPE elem_value) { if (!m_root) return false; if (m_root->get_value() == elem_value) { delete m_root; m_root = NULL; return true; } return m_root->del_elem(elem_value); }
friend ostream &operator<<(ostream &os, const CTree<ELEM_TYPE> &tree) { if (!tree.m_root) return os<<"empty tree"<<endl; else return os<<*(tree.m_root); } }; //////////////////////////////////////////////////////////////////////////// int main() { CTree<int> tree;
CTreeElem<int> *root_elem = tree.add_elem(NULL, 0); CTreeElem<int> *first_elem = tree.add_elem(root_elem, 1); CTreeElem<int> *second_elem = NULL; for (int i = 10; i < 13; ++i) { second_elem = tree.add_elem(first_elem, i); }
first_elem = tree.add_elem(root_elem, 2); for (int i = 20; i < 25; ++i) { second_elem = tree.add_elem(first_elem, i); } for (int i = 200; i < 207; ++i) { tree.add_elem(second_elem, i); }
first_elem = tree.add_elem(root_elem, 3); for (int i = 30; i < 40; ++i) { second_elem = tree.add_elem(first_elem, i); } cout<<tree<<endl;
cout<<"del element 204: "<<tree.del_elem(204)<<endl; cout<<tree<<endl;
cout<<"\n\ndel element 3: "<<tree.del_elem(3)<<endl; cout<<tree<<endl;
cout<<"\n\ndel element 555: "<<tree.del_elem(555)<<endl; cout<<tree<<endl;
cout<<"\n\ndel root: "<<tree.del_elem(0)<<endl; cout<<tree<<endl; cout<<"\n\nThe end!"<<endl; getch(); return 0; } ////////////////////////////////////////////////////////////////////////////
|
Добавлено @ 01:18 Что здесь не правильно?????? и вообще правильно ли я это делаю? |