Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.144.32] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток,
Ситуация такая: Дан код дерева, нужно закончить его редактировать, т.е. закончить удаление листка. Есть полное дерево, у которого начало (верхушка) с 4, всё то, что меньше 4 - идёт вверх, всё,что больше 4 - идёт вниз и так далее. 2-4: ветка номер 2, её "отец" номер 4, у неё есть дети - 1 и 3. Нужно, чтобы удалив ветку номер 2, удалилсь бы и её дети. Как можно реализовать удаление? List.java: package derevo; public class List { int znacenije; List left; List right; List roditel; public List(int l, List t) { znacenije = l; roditel = t; } public void dobavitList(int sk, List t) { if (sk > znacenije) { if (right != null) { right.dobavitList(sk, this.right); } else { right = new List(sk, t); } } else if (sk < znacenije) { if (left != null) { left.dobavitList(sk, this.left); } else { left = new List(sk, t); } } } public void printList(String tabas) { if (left != null) { left.printList(tabas + "\t"); } System.out.println(tabas + " " + this.znacenije+" - "+((roditel!=null)?roditel.znacenije:0)); if (right != null) { right.printList(tabas + "\t"); } } public List find(int sk) { if (this.znacenije == sk) { return this; } else { if (sk > this.znacenije && right != null) { return right.find(sk); } else if (sk < this.znacenije && left != null) { return left.find(sk); } } return null; } @Override public String toString() { return "List{" + "znacenije=" + znacenije+" "+roditel.znacenije + '}'; } } Derevce.java: package derevo; public class Derevce { List verhushka; public void dobavitList(int sk) { if (verhushka != null) { verhushka.dobavitList(sk, verhushka); } else { verhushka = new List(sk, null); } } public void udalitList(int sk) { List sl = findList(sk); if (sl.right == null && sl.right == null) { if (sk > sl.roditel.znacenije) { sl.roditel.right = null; } else if (sk < sl.roditel.znacenije) { sl.roditel.left = null; } } /*Здесь ещё нужно добавить код, который бы удалял и те листья, у которых есть подлистья (т.е. правую, левую либо обе ветки) */ } public List findList(int sk) { if (verhushka != null) { return verhushka.find(sk); } return null; } public void pechatat() { if (verhushka != null) { verhushka.printList(""); } else { System.out.println("Derevo pustoje"); } } } PrimerDereva.java: package derevo; public class PrimerDereva { public static void main(String[] args) { Derevce m = new Derevce(); //m.spausdinti(); m.dobavitList(4); m.dobavitList(2); m.dobavitList(3); m.dobavitList(1); m.dobavitList(6); m.dobavitList(9); m.dobavitList(19); m.pechatat(); m.udalitList(19); m.pechatat(); m.udalitList(2); m.pechatat(); List a = m.findList(23); System.out.println(a); } } |
Сообщ.
#2
,
|
|
|
procedure Remove(Node) if Node.Left != null Remove(Node.Left); if Node.Right != null Remove(Node.Left); if Node.Parent != null if Node = Node.Parent.Left Node.Parent.Left = null if Node = Node.Parent.Right Node.Parent.Right = null Очистить данные Node, если нужно |