![]() |
|
Модераторы: bsa |
![]()
|
|
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Есть n-мерное дерево
Хочу удалить поддерево.Для себя понял что ситуация может быть что удаляемое поддерево может быть последним в списке указателей своего отца и может быть в любом другом месте, тогда нужно список указателей отца на ветви копировать и заново заносить в массив указателей. Правильно я понял как мне нужно удалить?Или есть более простой способ удаления указателей отца поддерева? Это сообщение отредактировал(а) toxx - 28.3.2010, 21:50 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Нет, если ты пользуешься указателями, то ничего никуда копировать не надо. Тем более, что у тебя вектор. Просто в деструкторе Tree напиши корректное уничтожение всех поддеревьев (delete tree), а когда нужно удалить конкретное поддерево, то просто применяй к нему delete и erase к Trees.
|
|||
|
||||
| toxx |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Нашел как пользоваться erase, но почемуто, использовал find чтобы значеие было итератор,но он отказывается работать...
|
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
toxx, для вектора можно использовать операцию сложения результата метода begin() и индекса, для получения итератора на нужный элемент. Но лучше использовать std::advance()
|
|||
|
||||
| toxx |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
хмм хорошо понятно, а если я изменю структуру так
У меня уже будет не вектор(массив указателей), если мне нужно будет выполнить эту же задачу, то мне также не нужно будет копировать указатели?т.е. простое перемещение указателей например я нашел отца(у него нашел сына которого удалили delete'ом):
Я просто также сделал для вектора у меня была такая картина: 10 / \ 21 22 / 31 после удаления 10 / \ -172302 22 Это сообщение отредактировал(а) toxx - 29.3.2010, 00:36 |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Прежде, чем писать код, надо очень хорошо представлять себе алгоритм, который ты пытаешься реализовать. У тебя в коде написано непонятно что
Кто такие dLevel и dItem? Что за загадочный if(prev->count%2!=0) в цикле? Что такое вообще count в узле дерева? И что именно надо удалять - все поддерево или отдельный узел? |
|||
|
||||
| toxx |
|
||||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Я просто хотел спросить в общем) У меня есть задача удалить поддеревья где нечетное число листьев т.е.:
я ищу нечетное число листьев:
Далее я понял что если удалять поддерево то и у отца этого поддерева исчезнет указатель на этого сына т.е. как я понял нужно найти уровень отца
и собственно какой по номеру этот указатель
Далее я удаляю это поддерево
и Когда рекурсия идет обратно она останавливается на этом уровне
и удаляет его... Правильно я представляю задчу?или ошибся слегка? Поэтому я и спрашиваю если я буду присваивание указателей отца этого поддерева так
будет ли это верно, т.к. я читал что лучше скопировать указатели... Это сообщение отредактировал(а) toxx - 29.3.2010, 14:04 |
||||||||||||||||
|
|||||||||||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Сделай деструктор у Tree
|
|||
|
||||
| toxx |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Все сделал, все работает=) Спасибо Но я тут прочитал еще раз свое задание
У меня было дерево 10 / \ 21 22 / \ \ 33 32 45 / 34 После удаления оно стало 10 / \ 21 22 / \ 33 32 Вродебы это не правильно?(просто для себя определить верно я сделал или нет) Чтобы сделать тоже самое но только без std::vector<> для структуры
|
||||||||
|
|||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| toxx |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Просто меня смущает то что при вот таком вводе данных http://www.imagepost.ru/images/88/tt.jpg Удаляет все дерево, оставляя одну вершину... Это сообщение отредактировал(а) toxx - 29.3.2010, 21:04 |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Правильно удаляет - у вершины 3 потомка, что явно число нечетное. Т.ч. поддерево удаляется. До исследования поддеревьев глубже уже дело не доходит.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
toxx, это уже проблемы задания, а не его реализации. Обратись к тому, кто это задание выдал.
|
|||
|
||||
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
xvr, bsa
Обращусь, спасибо за помощь.Задание действительно звучит двояко. |
|||
|
||||
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Всё-таки мне я думаю что задача состоит маленько в другом.
Как я делаю, думаю это очень просто. Думаю из дерева нужно сделать что-то типа этого: http://www.imagepost.ru/?v=88/tt_2.jpg Думаю т.к. у 2 нечетное кол-во нужно удалить ветку 2-5 аналогично 4-6-7-8 Поддеревом как я понимаю нужно считать всё кроме корня т.е. 2,3,4 В свете этого я решил сделать свой класс вектор и функцию для удаления элемента из произвольного места массива Могу ли я применимо к указателям т.е. Vector<Tree*> выполнить удаление элементов 2,3? Вот мой класс Vector и функция удаления erase:
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |