/home/caleb/ASDV-Java/Semester 4/Assignments/ProjectTrees_CalebFontenot/src/main/java/edu/slcc/asdv/caleb/projecttrees_calebfontenot/TreeASDV.java |
nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt
nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java
package edu.slcc.asdv.caleb.projecttrees_calebfontenot;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Queue;
import java.util.Stack;
public class TreeASDV<T extends Comparable> {
private Node<T> root;
class Node<T> {
T data;
Node<T> leftChild;
Node<T> rightChild;
}
public boolean insert(T t) {
Node<T> newNode = new Node<>();
newNode.data = t;
if (root == null) {
root = newNode;
return true;
}
Node<T> current = root;
Node<T> parent = null;
while (current != null) {
parent = current;
if (t.compareTo(current.data) >= 0) {
current = current.rightChild;
} else {
current = current.leftChild;
}
}
if (t.compareTo(parent.data) >= 0) {
parent.rightChild = newNode;
} else {
parent.leftChild = newNode;
}
return true;
}
private void inOrder(Node<T> p) {
if (p == null) {
return;
}
inOrder(p.leftChild);
System.out.print(p.data + " ");
inOrder(p.rightChild);
}
public void inOrder() {
inOrder(this.root);
}
public Node<T> findNode(T t) {
Node<T> currentNode = root;
while (currentNode != null) {
if (t.compareTo(currentNode.data) == 0) {
return currentNode;
} else if (t.compareTo(currentNode.data) > 0) {
currentNode = currentNode.rightChild;
} else {
currentNode = currentNode.leftChild;
}
}
return null;
}
public boolean remove(T t) {
Node<T> parent = null;
Node<T> current = root;
while (current != null && !current.data.equals(t)) {
parent = current;
if (t.compareTo(current.data) > 0) {
current = current.rightChild;
} else {
current = current.leftChild;
}
}
if (current == null) {
return false;
}
if (current.leftChild == null && current.rightChild == null) {
if (current == root) {
root = null;
} else if (parent.leftChild == current) {
parent.leftChild = null;
} else {
parent.rightChild = null;
}
}
else if (current.leftChild == null || current.rightChild == null) {
Node<T> child = (current.leftChild != null) ? current.leftChild : current.rightChild;
if (current == root) {
root = child;
} else if (parent.leftChild == current) {
parent.leftChild = child;
} else {
parent.rightChild = child;
}
}
else {
Node<T> successor = getSuccessor(current);
current.data = successor.data;
remove(successor.data);
}
return true;
}
private Node<T> getSuccessor(Node<T> node) {
Node<T> current = node.rightChild;
Node<T> successorParent = node;
Node<T> successor = node;
while (current != null) {
successorParent = successor;
successor = current;
current = current.leftChild;
}
if (successor != node.rightChild) {
successorParent.leftChild = successor.rightChild;
successor.rightChild = node.rightChild;
}
return successor;
}
public ListIterator<T> listIterator() {
return null;
}
public void breadthFirstTraversal() {
if (root == null) {
return;
}
Queue<Node<T>> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node<T> current = queue.poll();
System.out.print(current.data + " ");
if (current.leftChild != null) {
queue.offer(current.leftChild);
}
if (current.rightChild != null) {
queue.offer(current.rightChild);
}
}
}
public int height() {
return calculateHeight(root);
}
private int calculateHeight(Node<T> node) {
if (node == null) {
return 0;
}
int leftHeight = calculateHeight(node.leftChild);
int rightHeight = calculateHeight(node.rightChild);
return 1 + Math.max(leftHeight, rightHeight);
}
public boolean isFullBST() {
int height = height();
int nodeCount = countNodes(root);
return nodeCount == (1 << height) - 1;
}
private int countNodes(Node<T> node) {
if (node == null) {
return 0;
}
return 1 + countNodes(node.leftChild) + countNodes(node.rightChild);
}
public void inorder() {
if (root == null) {
return;
}
Stack<Node<T>> stack = new Stack<>();
Node<T> current = root;
while (current != null || !stack.isEmpty()) {
while (current != null) {
stack.push(current);
current = current.leftChild;
}
current = stack.pop();
System.out.print(current.data + " ");
current = current.rightChild;
}
}
public static void main(String[] args) {
TreeASDV<Integer> tree = new TreeASDV<>();
tree.insert(5);
tree.insert(3);
tree.insert(7);
tree.insert(2);
tree.insert(4);
tree.insert(6);
tree.insert(8);
System.out.println("Breadth-First Traversal:");
tree.breadthFirstTraversal();
System.out.println();
System.out.println("Height of the tree: " + tree.height());
System.out.println("Is the tree a full binary tree? " + tree.isFullBST());
System.out.println("Inorder Traversal without Recursion:");
tree.inorder();
System.out.println();
}
}