neues
parent
45d95a70a4
commit
7052e9e82c
|
@ -7,7 +7,6 @@ import java.util.Queue;
|
||||||
public class BinaryBaumList {
|
public class BinaryBaumList {
|
||||||
Node root;
|
Node root;
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
private int findTreeHeightRekursiv(Node temp) {
|
private int findTreeHeightRekursiv(Node temp) {
|
||||||
if (temp == null)
|
if (temp == null)
|
||||||
|
@ -175,7 +174,6 @@ public class BinaryBaumList {
|
||||||
return findMaxIterativ(root);
|
return findMaxIterativ(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
private void printPreorder(Node temp) {// [root][left][right]
|
private void printPreorder(Node temp) {// [root][left][right]
|
||||||
if (temp == null)
|
if (temp == null)
|
||||||
|
@ -245,7 +243,6 @@ public class BinaryBaumList {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void printDepth() {
|
public void printDepth() {
|
||||||
// printPreorder(root);
|
// printPreorder(root);
|
||||||
// printInorder(root);
|
// printInorder(root);
|
||||||
|
@ -253,5 +250,204 @@ public class BinaryBaumList {
|
||||||
}
|
}
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Löschen von Knoten:
|
||||||
|
* - wenn eine Knote gelöscht werden soll, sollen erst 4 wichtige Eigenschaften betrachtet werden:
|
||||||
|
* 1. ob die Knote überhaupt igrendwo im Baum liegt (suchen)
|
||||||
|
* 2. ob die Knote ein Blatt (leaf Node) ist,das heißt die Knote hat weder rechte Knote noch linke Knote
|
||||||
|
* 3. ob die Knote nur ein einziges Kind hat
|
||||||
|
* 4. ob die Knote zwei Kinder hat
|
||||||
|
* 4.1 hier entscheidt man, was er nehmen möchte:
|
||||||
|
* . Inorder-Vorgänger: Suche nach dem größten Knoten im linken Teilbaum
|
||||||
|
* . Inorder-Nachfolger: Suche nach dem kleinsten Knoten im rechten Teilbaum.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 1. Suchen
|
||||||
|
private boolean searchNummberIterativ(int value) {
|
||||||
|
if (root == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Node temp = root;
|
||||||
|
while (temp.value != value) {
|
||||||
|
if (value < temp.value && temp.left != null)
|
||||||
|
temp = temp.left;
|
||||||
|
|
||||||
|
else if (value >= temp.value && temp.right != null)
|
||||||
|
temp = temp.right;
|
||||||
|
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (temp.value == value)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean searchNummberRekursiv(Node temp , int value) {
|
||||||
|
if (temp == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (temp.value == value)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
else if(value < temp.value)
|
||||||
|
return searchNummberRekursiv(temp.left , value);
|
||||||
|
|
||||||
|
else
|
||||||
|
return searchNummberRekursiv(temp.right , value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void searchNummber(int value) {
|
||||||
|
|
||||||
|
if(searchNummberRekursiv(root,value))
|
||||||
|
System.out.println("Ist gefunden: " + value);
|
||||||
|
else
|
||||||
|
System.out.println("Ist nicht gefunden!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//2. löschen als leaf Node
|
||||||
|
private void removeleafNode(int value) {
|
||||||
|
if (!searchNummberIterativ(value)) {
|
||||||
|
System.out.println("Die zahl befindet sich nicht im Baum!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Node temp = root;
|
||||||
|
Node merker = null;
|
||||||
|
while( temp.value != value) {
|
||||||
|
merker = temp;
|
||||||
|
if (value < temp.value)
|
||||||
|
temp = temp.left;
|
||||||
|
|
||||||
|
else if (value >= temp.value)
|
||||||
|
temp = temp.right;
|
||||||
|
}
|
||||||
|
if (temp.value < merker.value)
|
||||||
|
merker.left = null;
|
||||||
|
|
||||||
|
else
|
||||||
|
merker.right = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//3. lösche eine Knote mit einem einzigen Kind
|
||||||
|
private void removeWithOneChild(int value) {
|
||||||
|
if (!searchNummberIterativ(value)) {
|
||||||
|
System.out.println("Die zahl befindet sich nicht im Baum!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Node temp = root;
|
||||||
|
Node merker = null;
|
||||||
|
while( temp.value != value) {
|
||||||
|
merker = temp;
|
||||||
|
if (value < temp.value)
|
||||||
|
temp = temp.left;
|
||||||
|
|
||||||
|
else if (value >= temp.value)
|
||||||
|
temp = temp.right;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (temp.left != null)
|
||||||
|
merker.left = temp.left;
|
||||||
|
else
|
||||||
|
merker.right = temp.right;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//4. lösche eine Knote mit zwei Kindern
|
||||||
|
private void removeWithTwoChildern(int value) {
|
||||||
|
if (!searchNummberIterativ(value)) {
|
||||||
|
System.out.println("Die zahl befindet sich nicht im Baum!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Node temp = root;
|
||||||
|
Node merker = null;
|
||||||
|
while( temp.value != value) {
|
||||||
|
if (value < temp.value)
|
||||||
|
temp = temp.left;
|
||||||
|
|
||||||
|
else if (value >= temp.value)
|
||||||
|
temp = temp.right;
|
||||||
|
|
||||||
|
merker = temp;
|
||||||
|
}
|
||||||
|
temp = temp.left;
|
||||||
|
Node merker2 = temp;
|
||||||
|
while(temp.right != null) {
|
||||||
|
merker2 = temp;
|
||||||
|
temp = temp.right;
|
||||||
|
}
|
||||||
|
merker.value = temp.value;
|
||||||
|
merker2.right = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//2,3,4 Cases
|
||||||
|
private void removWithAllCases(int value) {
|
||||||
|
if (!searchNummberIterativ(value)) {
|
||||||
|
System.out.println("Die zahl befindet sich nicht im Baum!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Node temp = root;
|
||||||
|
Node merker = null;
|
||||||
|
while (temp.value != value) {
|
||||||
|
merker = temp;
|
||||||
|
if (value < temp.value)
|
||||||
|
temp = temp.left;
|
||||||
|
|
||||||
|
else if (value >= temp.value)
|
||||||
|
temp = temp.right;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Die knote ist ein Blatt (leaf Node)
|
||||||
|
if (temp.left == null && temp.right == null) {
|
||||||
|
if (merker == null)
|
||||||
|
root =null;
|
||||||
|
else if (merker.left == temp)
|
||||||
|
merker.left = null;
|
||||||
|
else
|
||||||
|
merker.right = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Die Knote hat genau ein Kind entweder links oder rechts
|
||||||
|
if (temp.left == null || temp.right == null) {
|
||||||
|
if (temp.left != null && temp.right == null)
|
||||||
|
merker.left = temp.left;
|
||||||
|
|
||||||
|
else
|
||||||
|
merker.right = temp.right;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Die Knote hat zwei Kinder
|
||||||
|
else {
|
||||||
|
merker = temp;
|
||||||
|
// weg(1): nach links gehen und ganz nach unten rechts gehen
|
||||||
|
temp = temp.left;
|
||||||
|
Node merker2 = temp;
|
||||||
|
while (temp.right != null) {
|
||||||
|
merker2 = temp;
|
||||||
|
temp = temp.right;
|
||||||
|
}
|
||||||
|
merker.value = temp.value;
|
||||||
|
merker2.right = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
public void removNode(int value) {
|
||||||
|
// removeleafNode(value);
|
||||||
|
//removeWithOneChild(value);
|
||||||
|
//removeWithTwoChildern(value);
|
||||||
|
removWithAllCases(value);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,15 +4,28 @@ public class Test {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
BinaryBaumList b1 = new BinaryBaumList();
|
BinaryBaumList b1 = new BinaryBaumList();
|
||||||
b1.addElement(15);
|
b1.addElement(50);
|
||||||
b1.addElement(6);
|
b1.addElement(30);
|
||||||
b1.addElement(3);
|
b1.addElement(70);
|
||||||
b1.addElement(9);
|
|
||||||
b1.addElement(8);
|
|
||||||
b1.addElement(20);
|
b1.addElement(20);
|
||||||
|
b1.addElement(40);
|
||||||
|
b1.addElement(60);
|
||||||
|
b1.addElement(80);
|
||||||
|
b1.addElement(15);
|
||||||
|
b1.addElement(22);
|
||||||
|
b1.addElement(35);
|
||||||
|
b1.addElement(45);
|
||||||
|
b1.addElement(21);
|
||||||
b1.addElement(25);
|
b1.addElement(25);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
System.out.print("[");
|
||||||
|
b1.printDepth();
|
||||||
|
System.out.print("]");
|
||||||
|
System.out.println();
|
||||||
|
b1.removNode(30);
|
||||||
System.out.print("[");
|
System.out.print("[");
|
||||||
b1.printDepth();
|
b1.printDepth();
|
||||||
System.out.print("]");
|
System.out.print("]");
|
||||||
|
@ -21,4 +34,6 @@ public class Test {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue