Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Удаления узлов из дерева |
Автор: ArniLand 22.9.2010, 20:35 | ||
По заданию нужно реализовать удаление узлов ( студенты которые служат в армии) из дерева. Не могу разобраться с ним, не могли бы привести пример пожалуйста и объяснить принцип удаления. Код программы:
|
Автор: world 22.9.2010, 20:48 |
Я смотрю Вы реализуете бинарное дерево, поэтому будем рассматривать удаление элемента в нём Случай 1. У удаляемого узла нет потомков Просто удалили узел и всё. Случай 2. У удаляемого узла 1 потомок Ставим потомка на место удаляемого элемента и удаляем необходимый узел. Случай 3. У удаляемого узла 2 потомка Находим либо самый правый элемент левого поддерева (в левом элементе идём всегда по правой ветки пока ещё будут элементы в право.) либо самый левый элемент правого поддерева(уж это как сами решите) и ставим его на место удаляемого. После этого удаляем необходимый узел. Если интересует могу привести код класса на C#, увы Java класс написанный для этих же целей удалил.. |
Автор: ArniLand 22.9.2010, 21:47 | ||
а как реализовать это условием того, что нужно удалять студентов которые служат в армии, то есть удалять узлы при условие?
|
Автор: mstalker26 23.9.2010, 00:40 |
Расскажите лучше, чего попробовали и какие мысли есть (пусть самые бредовые). А то уже третья тема в стиле "как там, напишите". Мы, конечно, напишем, но в голове-то Вашей знаний от этого не прибавится. P.S. Все вышеизложенное является только моим "имхом" ![]() |
Автор: world 23.9.2010, 00:57 | ||||||
Есть такая мысль делаем обход дерева и удаляем все узлы, где
Пример обхода дерева (прямой кажется называется) -проверяем узел -проверяем левый потомок -проверяем правый потомок
Вот это правильно конечно. ЗЫ Обход дерева у меня то же есть только на C# |
Автор: ArniLand 23.9.2010, 08:04 |
Не могли бы выложить пример на C#, если тут нельзя, можете в ЛС отправить |
Автор: ArniLand 23.9.2010, 12:28 |
world, нужно реализовывать все три случая? Мне нужен обход в ширину - я так реализовал. Правильно? public void preorderPrint(Node root) { if (root == null) { System.out.println(root.data + ""); preorderPrint(root.left); preorderPrint(root.right); } |
Автор: world 23.9.2010, 16:08 | ||||
Реализовали правильно. Теперь, что касается удаления. Кидаю код прям здесь. Только сразу извиняюсь перепутал, что дерево у меня на С++
|