|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.05.2012, 19:36 | #1 |
Новичок
Джуниор
Регистрация: 01.05.2012
Сообщений: 1
|
Бинарное дерево
Помогите
Добавить перегрузку следующих операторов в виде методов контейнерного класса + добавление элемента; + добавление элементов; > отношение порядка; ! реверс символов строк; [] индексирование; = копирование; Добавить перегрузку следующих операторов в виде дружественных функций - удаление элемента; == отношение равенства 2 контейнеров; ~ обмен соседних строк в контейнере местами; << вывод значения контейнера в стандартный поток вывода Вот код #include <iostream> template <typename T> class Bintree { class Node { friend class Bintree; T * value; Node * parent; Node * left; Node * right; Node(const T & val, Node * p = 0) : parent(p), left(0), right(0) { value = new T(val); } ~Node(){ delete value; } }; Node * root; bool insertNode(const T & val, Node * & n, Node * p = 0){ if ( ! n ){ n = new Node(val, p); return true; } else if ( *(n->value) > val ) return insertNode(val, n->left, n); else if ( *(n->value) < val ) return insertNode(val, n->right, n); else return false; } void insertTree(Node * & n, Node * t){ if ( ! n || ! t ) return; insertTree(n, t->left); insertTree(n, t->right); insertNode(*(t->value), n); } void delTree(Node * n){ if ( ! n ) return; delTree(n->left); delTree(n->right); delete n; n = 0; } Node * findNode(const T & val, Node * n) { if ( ! n ) return 0; else if ( *(n->value) == val ) return n; else if ( *(n->value) > val ) return findNode(val, n->left); else return findNode(val, n->right); } void dumpNodes(std:stream & ost, Node * n, std::string delim = " ") { if ( ! n ) return; dumpNodes(ost, n->left, delim); ost <<std::endl<< *(n->value) << std::endl; dumpNodes(ost, n->right, delim); } // çàêðûòûé êîíñòðóêòîð êîïèðîâàíèÿ Bintree(const Bintree &); Bintree operator = (const Bintree &); public: Bintree() : root(0) {} ~Bintree(){ delTree(root); } void add(const T & val){ if ( ! insertNode(val, root) ) throw ( std::string("Value exists!") ); } void remove(const T & val){ Node * n = findNode(val, root); if ( ! n ){ throw ( std::string("Value not found!") ); } else if ( n == root ){ if ( ! n->right ){ Node * nroot = n->left; delete root; if ( root = nroot ) root->parent = 0; } else { Node * nroot = root->right; Node * nleft; for ( nleft = nroot; nleft->left; nleft = nleft->left ) ; nleft->left = root->left; delete root; root = nroot; root->parent = 0; } } else { Node * & p = n->parent; if ( n == p->left ) p->left = 0; else p->right = 0; insertTree(p, n->left); insertTree(p, n->right); delTree(n); } } void dump(std:stream & ost, std::string delim = " "){ dumpNodes(ost, root, delim); } bool empty(){ return ! root; } }; |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Бинарное дерево Си | Evacuator | Помощь студентам | 2 | 01.06.2011 21:40 |
бинарное дерево | Intess | Помощь студентам | 0 | 23.05.2011 15:58 |
бинарное дерево | Lucefer2007 | Общие вопросы C/C++ | 0 | 17.04.2011 14:31 |
Бинарное дерево | CFYZ-07 | Помощь студентам | 0 | 16.03.2010 23:24 |