From 360abd4f8babf4fe0bfedc40c0ed9a7c531f0937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mei=C3=9Fner?= <daniel@3st.mine.nu> Date: Tue, 12 Jun 2012 22:29:27 +0200 Subject: [PATCH] Added lesson 8 exercise 2. --- .../src/SearchTree.java" | 174 ++++++++++++++++++ .../src/TreeTest.java" | 34 ++++ 2 files changed, 208 insertions(+) create mode 100644 "Aufgabenblatt_8-Aufgabe_2-Implementierung_des_L\303\266schens_in_Suchb\303\244umen/src/SearchTree.java" create mode 100644 "Aufgabenblatt_8-Aufgabe_2-Implementierung_des_L\303\266schens_in_Suchb\303\244umen/src/TreeTest.java" diff --git "a/Aufgabenblatt_8-Aufgabe_2-Implementierung_des_L\303\266schens_in_Suchb\303\244umen/src/SearchTree.java" "b/Aufgabenblatt_8-Aufgabe_2-Implementierung_des_L\303\266schens_in_Suchb\303\244umen/src/SearchTree.java" new file mode 100644 index 0000000..c1031a5 --- /dev/null +++ "b/Aufgabenblatt_8-Aufgabe_2-Implementierung_des_L\303\266schens_in_Suchb\303\244umen/src/SearchTree.java" @@ -0,0 +1,174 @@ +public class SearchTree<T extends Comparable<T>> { + + private class Node { + T value; + Node left; + Node right; + + Node(T val) { + value = val; + left = null; + right = null; + } + } + + private Node root; + private int size; + + public SearchTree() { + root = null; + size = 0; + } + + public int size() { + return size; + } + + public boolean contains(T elem) { + Node node = root; + int diff; + + while (node != null) { + diff = node.value.compareTo(elem); + if (diff == 0) { + return true; + } + else if (diff>0) { + node = node.left; + } + else { + node = node.right; + } + } + + return false; + + } + + public void insert(T elem) { + Node node = root; + Node father = null; + + int diff=0; + + while (node!=null) { + father = node; + diff = node.value.compareTo(elem); + if (diff==0) { + return; + } + else if (diff>0) { + node = node.left; + } + else { + node = node.right; + } + } + + node = new Node(elem); + + if (father==null) { + root = node; + } + else if (diff>0) { + father.left = node; + } + else { + father.right = node; + } + + size++; + } + + public void delete(T elem) { + Node node = root; + Node wurzel = node; + Node father = null; + int diff=0; + + // suche nach zu loeschenden node + while (node!=null) { + father = node; + diff = node.value.compareTo(elem); + + // node gefunden + if (diff==0) { + node = null; + + if ( father.left == null && father.right == null) { + // Moeglichkeit a (w ist ein Blatt) + System.out.println("a"); + diff = father.value.compareTo(wurzel.value); + + if (diff>0) { + wurzel.right = null; + } else + wurzel.left = null; + + size--; + + + } else if ( father.left != null && father.right == null ) { + // Moeglichkeit b 1 (Tl ist nicht leer, Tr ist leer) + System.out.println("Fall: Moeglichkeit b 1 (Tl ist nicht leer, Tr ist leer)"); + diff = wurzel.value.compareTo(father.left.value); + + if (diff>0) { + wurzel.left = father.left; + } else + wurzel.right = father.left; + + size--; + + } else if ( father.left == null && father.right != null ) { + // Moeglichkeit b 2 (Tl ist leer, Tr ist nicht leer) + System.out.println("Fall: Moeglichkeit b 2 (Tl ist leer, Tr ist nicht leer)"); + diff = wurzel.value.compareTo(father.right.value); + + if (diff>0) { + wurzel.left = father.right; + } else + wurzel.right = father.right; + + size--; + + + } else if ( father.left != null && father.right != null ) { + // Moeglichkeit c (Weder Tl noch Tr ist leer) + System.out.println("Fall: Moeglichkeit c (Weder Tl noch Tr ist leer)"); + Node maximum = null; + Node oldFather = null; + + if ( father.right.left == null ) + maximum = father.right; + else + maximum = maximumAbKnoten(father.right.left); + + father.value = maximum.value; + + size--; + + } + } + // wenn node nicht gefunden, merke dir die wurzel und gehe weiter im tree + else if (diff>0) { + wurzel = node; + node = node.left; + } + else { + wurzel = node; + node = node.right; + } + } + } + + private Node maximumAbKnoten(Node knoten) { + Node node = knoten; + + while (node.right != null) { + node = node.right; + } + + return node; + } +} \ No newline at end of file diff --git "a/Aufgabenblatt_8-Aufgabe_2-Implementierung_des_L\303\266schens_in_Suchb\303\244umen/src/TreeTest.java" "b/Aufgabenblatt_8-Aufgabe_2-Implementierung_des_L\303\266schens_in_Suchb\303\244umen/src/TreeTest.java" new file mode 100644 index 0000000..1ea7bc3 --- /dev/null +++ "b/Aufgabenblatt_8-Aufgabe_2-Implementierung_des_L\303\266schens_in_Suchb\303\244umen/src/TreeTest.java" @@ -0,0 +1,34 @@ +public class TreeTest { + public static void main(String[] args) { + SearchTree tree = new SearchTree(); + + tree.insert(35); + tree.insert(17); + tree.insert(28); + tree.insert(33); + tree.insert(42); + tree.insert(58); + tree.insert(55); + tree.insert(19); + tree.insert(22); + + System.out.println("Baum enthält 35 17 28 33 42 58 55 19 22"); + System.out.println("Größe: " + tree.size() + "\n"); + + System.out.println("Lösche 58."); + tree.delete(58); + System.out.println("Lösche 35."); + tree.delete(35); + + System.out.println("\nEnthält 35? " + tree.contains(35)); + System.out.println("Enthält 17? " + tree.contains(17)); + System.out.println("Enthält 28? " + tree.contains(28)); + System.out.println("Enthält 33? " + tree.contains(33)); + System.out.println("Enthält 42? " + tree.contains(42)); + System.out.println("Enthält 58? " + tree.contains(58)); + System.out.println("Enthält 55? " + tree.contains(55)); + System.out.println("Enthält 19? " + tree.contains(19)); + System.out.println("Enthält 22? " + tree.contains(22)); + System.out.println("Größe: " + tree.size()); + } +} \ No newline at end of file -- GitLab