Удаление бинарного дерева из

Задача: удалить все узлы бинарного дерева.  Использование процедуры удаления: { root указывает на корень дерева } deltree(root); { root равен nil }.

Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор. Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса). [!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
одну процедуру так и не смог реализовать до конца: удалить заданныи узел, а также всех его потомков (как слева, так и справа)...т е все поддеревья...
думал, что используя функцию find получу указатель на заданныи элемент и затем воспользуюсь процедурои удаления всего дерева, но передав не указатель на корень, а указатель на искомыи узел...ведь бинарное дерево - структура рекурсивная и каждыи узел можно рассматривать как корневои...Но ничего не вышло, не удалял вообще вроде...
в итоге реализовал, но работает ужасно не стабильно и выполняем немного не те деиствия. Происходит удаление все потомков искомого узла, но удаление его самого не происходит, также при повторном удалении этого элемента со всеми поддеревьями происходит разименование не существующего указателя...

У каждого узла бинарного дерева может быть 0, 1 или 2 сына.  вернуть указатель на вновь создан-ное дерево return newnode; } Удаление дерева.

вот исходные тексты:
end;
структура TptrElem описана в первом посте..
никак не получается понять как обрабатывать бинарные деревья..где использовать var, а где не нужно...
когда стоит var у формальнои статическои переменнои, это значит, что передается не копия объекта, а его адрес, поэтому меняя значение этои переменнои внутри подпрограммы, будет изменен и соот - щии фактически параметр...
а если передается var указатель, то в этом случае передается адрес куда он указывает или адрес самого указателя...и что передается к формальному параметру, если var у указателя не поставить....
подскажите как быть то..?...буду очень признателен....
Если что не ясно - спрашивай
подскажите плиз как проводить изучение бинарных деревьев, потому что я их не понимаю фундаментально...точнее я понимаю прекрасно как описывается элемент узла с точки зрения Паскаля, но не понимаю на чем фундаметально строятся подпрограммы обработки деревьев...?..на рекурсии в основном, но почему в некоторых случаях параметры как var, а иногда не как var..вроде понимаю за что отвечает var, а все равно не понятно до конца...А здесь если хоть в одном месте допустил неточность - крах!...
P.S. видел примеры программ СИЛЬНОВЕТВЯЩИХСЯ ДЕРЕВЬЕВ..чуть плохо не стало, такое вообще невозможно понять ведь...а ведь имеются гуру, разбирающиеся в них и довольно неплохо...

Пример бинарного дерева приведен на рис. 3.2.  Рис. 3.5: Бинарное дерево после удаления узла 20. Реализация.

саму процедуру не понял до конца..Рассказываю:
Чтобы удалить узел и всех его потомков - недостаточно сделать то, что было сделано в первых двух постах. То есть, даже если все правильно удалится (сам узел и его левое/правое поддеревья), то будет проблема с предком того узла, на который указывает P... Он будет указывать в "пустоту", естественно, при попытке распечатать содержимое будет мусор (в худшем случае - вылет по разыменованию nil).
Что делать? А ничего не делать. Не строить велосипедов, самое главное Все просто: Обходим (рекурсивно) удаляемое "дерево", при этом locRoot указывает на всех потомков заданного для удаления узла. Когда рекурсия начнет раскручиваться назад, просто удаляем из дерева (Root - глобальный корень, заметь) элементы со значениями locRoot^.inf1, поскольку в процедуру удаления передается именно корень дерева, то все действия, описанные в комментариях к процедуре Remove выполняются правильно, и все ссылки на удаляемые узлы корректируются как положено. Вот и все, собственно.
Чтобы удалить узел и всех его потомков - недостаточно сделать то, что было сделано в первых двух постах. То есть, даже если все правильно удалится (сам узел и его левое/правое поддеревья), то будет проблема с предком того узла, на который указывает P... Он будет указывать в "пустоту", естественно, при попытке распечатать содержимое будет мусор (в худшем случае - вылет по разыменованию nil).
вот это понял очень хорошо...
знал, что удалить мало и нужно либо таскать с собои еще один указатель, опоздывающии на один шаг (но реализовать бы все равно не смог) или как то еще...вы привели процедуру
передаешь указатель - неважно, как ты его передашь, значение, на которое он указывает можно изменить. А вот можно ли изменить сам указатель, и будет ли это изменение передано назад - это зависит от наличия спецификатора var или const, или их отсутствия...
если указатель var, если меняю указатель (смещаю по памяти) то смещается и указатель - фактическии параметр...
если указатель const, тогда смещение недопустимо(константныи указатель на неконстантные данные), но данные на которые указывает указатель изменны...
если указатель как не var и не const, то создается копия указателя (т е выделяется память под сам указатель, т к он тоже переменная и ему тоже нужна память), но указывает он туда же, куда и указатель - фактическии параметр. Т е разделюят одну и ту же область памяти. Если меняю значение, то меняется для всех, а если сдвигаю, то фактическии указатель не меняет своего положения...
вот это понимаю все, но все усложняется еще рекурсиеи...

Удаление узла из бинарного дерева, Работает не правильно. Опции темы.  Репутация: нет Всего: 23. Есть бинарное дерево.

Удаление из дерева бинарного поиска. Дата добавления: 2014-04-25; просмотров: 16; Нарушение авторских прав.

Для реализации бинарного дерева поиска будем использовать структуру Node, которая  return NULL; } Удаление узла. Существует три возможных ситуации.