BinaryTree/BinaryTree.java
2026-02-09 08:52:52 +01:00

143 lines
3.9 KiB
Java

public class BinaryTree {
private Node rootNode = null;
public BinaryTree() {}
public BinaryTree(int content) {
insert(content);
}
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;
}
}
}
// 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());
}
}
}