| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [c++] двоичное -> многомерное дерево |
| Автор: KpoHyc 21.1.2007, 15:24 | ||
| Есть класс для бинарного дерева, - нужно передалать его в многомерное дерево и немного исправить вывод. допустим: (1) / | \ (2) (3)(4) / \ (5)(6) Нужно чтобы вывело: 1 2 5 6 /2 3 4 /1
|
| Автор: PoloS 21.1.2007, 16:52 | ||
какое дерево, когда ты написал класс работы с двусвязным списком или я не могу разобратся в твоей реализации... |
| Автор: KpoHyc 21.1.2007, 20:24 | ||
PoloS,
|
| Автор: PoloS 21.1.2007, 20:38 | ||||||
смотрим... insert вставляет элемент в "дерево". да?
получается список какой - то с вставкой с начала... бинарное дерево, это узел должен иметь указаетель на своего родителся и на левый и правый узел, для которого он является родителем. у тебя получается head prev указывает на n, а n, в качестве следуещего элемента указывает на head.... вывод:
у бинарного дерева 2 "наследника" а ты идешь по одной ветке next... вот я и говорю что реализация напоминает двусвязный список..
|
| Автор: KpoHyc 21.1.2007, 22:15 |
| PoloS, читай все таки внимательней...я прошу передалать а не объяснить что там... |
| Автор: V.A.KeRneL 22.1.2007, 10:42 |
Оно конечно, но... Ты говоришь, что «есть класс для бинарного дерева», а приводишь класс для L2List'а (двусвязного списка), который, если рассуждать абстрактно, с точки зрения теории графов, является одинарным деревом (вырожденный случай) [с сслыками на родителей]. Извини, конечно, что объясняем тебе, вмето того, чтобы «помочь» и переписать, но тебе реально трудно помочь в сложившейся ситуации!.. Проще было бы, если бы ты просто попросил написать классы, реализующие двоичное (бинарное) и «многомерное» деревья. |
| Автор: KpoHyc 22.1.2007, 11:20 |
| V.A.KeRneL, таГ легче? (испрвил код верхний). Извиняюсь - и в правду накосячил в коде |
| Автор: PoloS 22.1.2007, 21:19 |
| Завтра последний экзамен сдам и обещаю помочь с реализацией. |
| Автор: Alexeis 23.1.2007, 01:12 |
| PoloS, личные сообщения в ПМ пожалуйста. |
| Автор: PoloS 23.1.2007, 17:47 | ||||
| подобная проблема описана в 1 томе Кнута "Искусство программирования". Вот вырезки от туда: Основные отличия деревьев от бинарных: 1) Дерево всегда имеет корень. 2) Каждый узел может иметь 0, 1, 2, 3, ... детей. Вот алгоритм "перевода" дерева в бинарное дерево (представление многомерных деревьев в виде бинарных деревьев) Пусть F = (T1, T2, ..., Tn) - некоторый лес деревьев. Тогда бинарное дерево B(F), соответствующее F, можно строго определить следующим образом: a) Если n = 0, то B(F) пусто. b) Если n > 0, то корень B(F) является корнем (T1); B(T11, T12, ..., T1m) является левым поддеревом дерева B(F), где T11, T12, ..., T1m - поддеревья корня (T1); B(T2, ..., Tn) является правым поддеревом дерева B(F). на прикрепленной картинке наглядно показано правило. я не стал переделывать твой "класс" (там структуры и функции), а написал свой параметризированный (чтобы работал с разными типами данных). Вот некоторые его ограничения: 1) дерево не может быть пустым (в узле root всегда есть данные) 2) Если удаляется узел, то автоматически удаляются все его поддеревья. 3) Значения в data не должны повторятся (иначе я не знаю что произойдет, но последствия будут это точно =) (хотя бы потому что функция удаления узла (и вставки) будет удалять первый попавшийся узел с совпавшим значением))
вот небольшой тест для класса:
сперва образуется дерево такое 1 / / \ \ 2 3 4 5 /| |\ 6 7 8 9 в памяти хранится как такое 1 / 2 \ 3 \ 4 / \ 6 5 \ 7 \ 8 \ 9 после удаления узла 4 в памяти так 1 / 2 \ 3 \ 5 фуф... ЗЫ. Класс не отлажен должным образом, так что не пинайте меня. |
| Автор: PoloS 24.1.2007, 09:19 |
| KpoHyc, тебе уже не нужно это? нах тогда я стока лопатил... |