161 lines
4.4 KiB
Java
161 lines
4.4 KiB
Java
public class BinaryTree {
|
|
private Node rootNode = null;
|
|
|
|
public BinaryTree() {}
|
|
|
|
public BinaryTree(int content) {
|
|
insert(content);
|
|
}
|
|
|
|
public Node getRoot() {
|
|
return rootNode;
|
|
}
|
|
|
|
public boolean search(int value) {
|
|
if (rootNode == null) {
|
|
return false;
|
|
}
|
|
|
|
return searchRecursiv(rootNode, value);
|
|
}
|
|
|
|
private boolean searchRecursiv(Node node, int value) {
|
|
int content = node.getContent();
|
|
|
|
if (value == content) {
|
|
return true;
|
|
} else if (value > content) {
|
|
Node leftNode = node.getLeftNode();
|
|
if (leftNode == null) {
|
|
return false;
|
|
}
|
|
return searchRecursiv(leftNode, value);
|
|
} else if (value < content) {
|
|
Node rightNode = node.getRightNode();
|
|
if (rightNode == null) {
|
|
return false;
|
|
}
|
|
return searchRecursiv(rightNode, value);
|
|
} else {
|
|
System.out.println("Something went wrong!");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void remove(int value) {
|
|
rootNode = removeRecursiv(rootNode, value);
|
|
}
|
|
|
|
private Node removeRecursiv(Node root, int value) {
|
|
if (root == null) {
|
|
return null;
|
|
}
|
|
|
|
if (value < root.getContent()) {
|
|
root.setLeftNode(removeRecursiv(root.getLeftNode(), value));
|
|
} else if (value > root.getContent()) {
|
|
root.setRightNode(removeRecursiv(root.getRightNode(), value));
|
|
} else {
|
|
if (root.getLeftNode() == null) {
|
|
return root.getRightNode();
|
|
}
|
|
if (root.getRightNode() == null) {
|
|
return root.getLeftNode();
|
|
}
|
|
Node next = findMinimum(root.getRightNode());
|
|
root.setContent(next.getContent());
|
|
root.setRightNode(removeRecursiv(root.getRightNode(), next.getContent()));
|
|
}
|
|
return root;
|
|
}
|
|
|
|
private Node findMinimum(Node root) {
|
|
if (root.getLeftNode() == null) {
|
|
return root;
|
|
}
|
|
return findMinimum(root.getLeftNode());
|
|
}
|
|
|
|
public void insert(int content) {
|
|
if (rootNode == null) {
|
|
Node newNode = new Node(content);
|
|
rootNode = newNode;
|
|
} else {
|
|
insertRecursiv(rootNode, content);
|
|
}
|
|
}
|
|
|
|
private void insertRecursiv(Node currentNode, int content) {
|
|
int currentContent = currentNode.getContent();
|
|
|
|
// has to be inserted left
|
|
if (currentContent <= content) {
|
|
// if node == null -> insert left
|
|
if (currentNode.getLeftNode() == null) {
|
|
Node newNode = new Node(content);
|
|
currentNode.setLeftNode(newNode);
|
|
System.out.println("Inserted Left");
|
|
return;
|
|
} else {
|
|
// traverse -> 1 down
|
|
insertRecursiv(currentNode.getLeftNode(), content);
|
|
return;
|
|
}
|
|
} else /* insert right */ {
|
|
// if node == null -> insert right
|
|
if (currentNode.getRightNode() == null) {
|
|
Node newNode = new Node(content);
|
|
currentNode.setRightNode(newNode);
|
|
System.out.println("Inserted Right");
|
|
return;
|
|
} else {
|
|
// traverse -> 1 down
|
|
insertRecursiv(currentNode.getRightNode(), content);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void traversePreOrder(Node node) {
|
|
if (node != null) {
|
|
System.out.print(" " + node.getContent());
|
|
traversePreOrder(node.getLeftNode());
|
|
traversePreOrder(node.getRightNode());
|
|
}
|
|
}
|
|
|
|
public void traversePostOrder(Node node) {
|
|
if (node != null) {
|
|
traversePostOrder(node.getLeftNode());
|
|
traversePostOrder(node.getRightNode());
|
|
System.out.print(" " + node.getContent());
|
|
}
|
|
}
|
|
|
|
// Print functions from https://www.baeldung.com/java-print-binary-tree-diagram
|
|
// public void print() {
|
|
// StringBuilder sb = new StringBuilder();
|
|
// traversePreOrder(sb, "", "", rootNode);
|
|
// System.out.println(sb.toString());
|
|
// }
|
|
|
|
// private void traversePreOrder(StringBuilder sb, String padding, String pointer, Node node) {
|
|
// if (node != null) {
|
|
// sb.append(padding);
|
|
// sb.append(pointer);
|
|
// sb.append(node.getContent());
|
|
// sb.append("\n");
|
|
|
|
// StringBuilder paddingBuilder = new StringBuilder(padding);
|
|
// paddingBuilder.append("| ");
|
|
|
|
// String paddingForBoth = paddingBuilder.toString();
|
|
// String pointerForRight = "---";
|
|
// String pointerForLeft = (node.getRightNode() != null) ? "+--" : "'--";
|
|
|
|
// traversePreOrder(sb, paddingForBoth, pointerForLeft, node.getLeftNode());
|
|
// traversePreOrder(sb, paddingForBoth, pointerForRight, node.getRightNode());
|
|
// }
|
|
// }
|
|
}
|