/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.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
<T>
public class TreeASDV<T extends Comparable> implements Cloneable {
private Node<T> root;
class Node<T> {
T data;
Node<T> leftChild;
Node<T> rightChild;
}
@Override
public Object clone()
{
System.out.println("Cloning...");
TreeASDV<T> clone = new TreeASDV<T>();
ArrayList<T> oldData = this.getBreadthFirstArray();
for (int i = 0; i < oldData.size(); ++i) {
clone.insert(oldData.get(i));
}
return clone;
}
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 (Node<T> p)
{
if (p == null) {
return;
}
inOrder(p.leftChild);
System.out.print(p.data + " ");
inOrder(p.rightChild);
}
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> successorParent = current;
Node<T> successor = current.rightChild;
while (successor.leftChild != null) {
successorParent = successor;
successor = successor.leftChild;
}
current.data = successor.data;
if (successorParent == current) {
successorParent.rightChild = successor.rightChild;
} else {
successorParent.leftChild = successor.rightChild;
}
}
return true;
}
private Node<T> (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 Iterator<T> listIterator()
{
return new InorderIterator();
}
private class InorderIterator implements Iterator<T> {
private Stack<Node<T>> stack;
public InorderIterator()
{
stack = new Stack<>();
pushLeft(root);
}
private void pushLeft(Node<T> node)
{
while (node != null) {
stack.push(node);
node = node.leftChild;
}
}
@Override
public boolean hasNext()
{
return !stack.isEmpty();
}
@Override
public T next()
{
if (!hasNext()) {
throw new java.util.NoSuchElementException();
}
Node<T> current = stack.pop();
pushLeft(current.rightChild);
return current.data;
}
@Override
public void remove()
{
throw new UnsupportedOperationException();
}
}
public ArrayList<T> getBreadthFirstArray()
{
ArrayList<T> returnArray = new ArrayList<T>();
if (root == null) {
return returnArray;
}
Queue<Node<T>> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node<T> current = queue.poll();
returnArray.add(current.data);
if (current.leftChild != null) {
queue.offer(current.leftChild);
}
if (current.rightChild != null) {
queue.offer(current.rightChild);
}
}
return returnArray;
}
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);
}
}
}
@Override
public boolean equals(Object obj) {
return this.getBreadthFirstArray().equals(((TreeASDV) obj).getBreadthFirstArray());
}
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) throws CloneNotSupportedException
{
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();
System.out.println("array list from breadth traversal");
System.out.println(tree.getBreadthFirstArray());
System.out.println("Cloned Tree:");
TreeASDV<Integer> clonedTree = (TreeASDV<Integer>) tree.clone();
clonedTree.breadthFirstTraversal();
System.out.println();
System.out.println("Does the original tree and the clone tree equal? " + (tree.equals(clonedTree) ? "yes" : "no") );
tree.insert(3000000);
System.out.println("Does the original tree and the clone tree equal? " + (tree.equals(clonedTree) ? "yes" : "no") );
tree.remove(5);
tree.breadthFirstTraversal();
}
}