From 672f85a96bf9f161f54eba2583b159bfc4a704c1 Mon Sep 17 00:00:00 2001 From: Chloe Christine Fontenot Date: Sun, 19 Oct 2025 21:31:19 -0500 Subject: [PATCH] agh --- .../nb-configuration.xml | 18 + .../ManyToManyFactory.java | 22 +- .../Printed HTMLs/TreeASDV.html | 371 ++++++++++++------ .../projecttrees_calebfontenot/TreeASDV.java | 104 ++--- .../ZIPs/ProjectTrees_CalebFontenot.zip | Bin 0 -> 10203 bytes 5 files changed, 328 insertions(+), 187 deletions(-) create mode 100644 Semester 4/Assignments/MP1_ManyToMany_CalebFontenot/nb-configuration.xml create mode 100644 Semester 4/ZIPs/ProjectTrees_CalebFontenot.zip diff --git a/Semester 4/Assignments/MP1_ManyToMany_CalebFontenot/nb-configuration.xml b/Semester 4/Assignments/MP1_ManyToMany_CalebFontenot/nb-configuration.xml new file mode 100644 index 0000000..6ecd386 --- /dev/null +++ b/Semester 4/Assignments/MP1_ManyToMany_CalebFontenot/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + Graal_JDK_20 + + diff --git a/Semester 4/Assignments/MP1_ManyToMany_CalebFontenot/src/main/java/edu/slcc/asdv/caleb/mp1_manytomany_calebfontenot/ManyToManyFactory.java b/Semester 4/Assignments/MP1_ManyToMany_CalebFontenot/src/main/java/edu/slcc/asdv/caleb/mp1_manytomany_calebfontenot/ManyToManyFactory.java index 14794bf..cc64074 100644 --- a/Semester 4/Assignments/MP1_ManyToMany_CalebFontenot/src/main/java/edu/slcc/asdv/caleb/mp1_manytomany_calebfontenot/ManyToManyFactory.java +++ b/Semester 4/Assignments/MP1_ManyToMany_CalebFontenot/src/main/java/edu/slcc/asdv/caleb/mp1_manytomany_calebfontenot/ManyToManyFactory.java @@ -27,7 +27,7 @@ public class ManyToManyFactory { createManyToMany() { return new ManyToMany() { - private HashSet parents = new HashSet(); + //private HashSet parents = new HashSet(); private Map left = new HashMap(); private Map right = new HashMap(); @@ -39,7 +39,9 @@ public class ManyToManyFactory { } /** - * Creates a Many to Many relationship between the parentLeft and the childrenRight. Example for ( Many1 a, Many2 1, 2, 3) it creates --> (a 1) ( a 2 ) ( a 3 ) and ( 1, a ), ( 2, a ), ( 3, a). No duplicate values of Many2 are allowed. + * Creates a Many to Many relationship between the parentLeft and the childrenRight. + * Example for ( Many1 a, Many2 1, 2, 3) it creates --> (a 1) ( a 2 ) ( a 3 ) and ( 1, a ), ( 2, a ), ( 3, a). + * No duplicate values of Many2 are allowed. * * @param parentLeft - exactly one Many1 object. * @param childrenRight - one or more Many2 objects. @@ -53,17 +55,13 @@ public class ManyToManyFactory { public List add(Many1 parentLeft, Many2... childrenRight) { List returnList = new ArrayList(); - // Check to see if values already exist in this many to many object - if (this.left != parentLeft && this.left != null) { - returnList.add((Many2) this.left); - this.left = (Map) parentLeft; - } - if (this.left != childrenRight && this.right != null) { - returnList.add((Many2) this.right); - this.left = (Map) childrenRight; - left.put(parentLeft, Arrays.asList(childrenRight)); - + + // Check for exceptions + if (!childrenRight.equals(parentLeft.getClass())) { + throw new ClassCastException(); } + left.put(parentLeft, new ArrayList(Arrays.asList(childrenRight))); + return returnList; } @Override diff --git a/Semester 4/Assignments/ProjectTrees_CalebFontenot/Printed HTMLs/TreeASDV.html b/Semester 4/Assignments/ProjectTrees_CalebFontenot/Printed HTMLs/TreeASDV.html index f07dcca..20a38e5 100644 --- a/Semester 4/Assignments/ProjectTrees_CalebFontenot/Printed HTMLs/TreeASDV.html +++ b/Semester 4/Assignments/ProjectTrees_CalebFontenot/Printed HTMLs/TreeASDV.html @@ -8,17 +8,18 @@ body {color: #a9b7c6; background-color: #2b2b2b; font-family: monospace; font-weight: bold} pre {color: #a9b7c6; background-color: #2b2b2b; font-family: monospace; font-weight: bold} table {color: #888888; background-color: #313335; font-family: monospace; font-weight: bold} -.number {color: #6897bb} .string {color: #6a8759} -.ST1 {color: #9876aa} -.ST2 {color: #ffc66d} +.number {color: #6897bb} +.ST2 {color: #9876aa} +.ST3 {color: #ffc66d} +.ST1 {color: #8a653b} .comment {color: #808080} .whitespace {color: #505050} -.ST3 {color: #9876aa; font-family: monospace; font-weight: bold; font-style: italic} -.ST5 {color: #ffc66d; font-family: monospace; font-weight: bold; font-style: italic} +.ST4 {color: #9876aa; font-family: monospace; font-weight: bold; font-style: italic} +.ST6 {color: #ffc66d; font-family: monospace; font-weight: bold; font-style: italic} .ST0 {color: #287bde} .literal {color: #cc7832} -.ST4 {font-family: monospace; font-weight: bold; font-style: italic} +.ST5 {font-family: monospace; font-weight: bold; font-style: italic} --> @@ -31,138 +32,163 @@ table {color: #888888; background-color: #313335; font-family: monospace; font-w */ package edu.slcc.asdv.caleb.projecttrees_calebfontenot; +import java.util.ArrayList; +import java.util.Iterator; import java.util.LinkedList; -import java.util.ListIterator; +import java.util.ListIterator; import java.util.Queue; import java.util.Stack; /** * * @author caleb + * @param <T> */ -public class TreeASDV<T extends Comparable> { +public class TreeASDV<T extends Comparable> implements Cloneable { - private Node<T> root; + private Node<T> root; class Node<T> { - T data; - Node<T> leftChild; - Node<T> rightChild; + T data; + Node<T> leftChild; + Node<T> rightChild; } - public boolean insert(T t) { - Node<T> newNode = new Node<>(); - newNode.data = t; + @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) { + //System.out.println(oldData.get(i)); + clone.insert(oldData.get(i)); + } + return clone; + } - if (root == null) { - root = newNode; + 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> current = root; Node<T> parent = null; while (current != null) { parent = current; - if (t.compareTo(current.data) >= 0) { - current = current.rightChild; + if (t.compareTo(current.data) >= 0) { + current = current.rightChild; } else { - current = current.leftChild; + current = current.leftChild; } } // At this point, 'parent' is the node where the new node should be inserted as a child - if (t.compareTo(parent.data) >= 0) { - parent.rightChild = newNode; + if (t.compareTo(parent.data) >= 0) { + parent.rightChild = newNode; } else { - parent.leftChild = newNode; + parent.leftChild = newNode; } return true; } - private void inOrder(Node<T> p) { + private void inOrder(Node<T> p) + { if (p == null) { return; } - inOrder(p.leftChild); - System.out.print(p.data + " "); - inOrder(p.rightChild); + 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; + public Node<T> findNode(T t) + { + Node<T> currentNode = root; while (currentNode != null) { - if (t.compareTo(currentNode.data) == 0) { + if (t.compareTo(currentNode.data) == 0) { return currentNode; - } else if (t.compareTo(currentNode.data) > 0) { - currentNode = currentNode.rightChild; + } else if (t.compareTo(currentNode.data) > 0) { + currentNode = currentNode.rightChild; } else { - currentNode = currentNode.leftChild; + currentNode = currentNode.leftChild; } } return null; } + +public boolean remove(T t) { + // Initialize parent and current nodes for traversal + Node<T> parent = null; + Node<T> current = root; - public boolean remove(T t) { - // Initialize parent and current nodes for traversal - Node<T> parent = null; - Node<T> current = root; - - // Search for the node to be removed - while (current != null && !current.data.equals(t)) { - parent = current; - if (t.compareTo(current.data) > 0) { - current = current.rightChild; - } else { - current = current.leftChild; - } + // Search for the node to be removed + while (current != null && !current.data.equals(t)) { + parent = current; + if (t.compareTo(current.data) > 0) { + current = current.rightChild; + } else { + current = current.leftChild; } - - // If node not found, return false - if (current == null) { - return false; - } - - // Case 1: Node with no children - if (current.leftChild == null && current.rightChild == null) { - if (current == root) { - root = null; // Removing root node - } else if (parent.leftChild == current) { - parent.leftChild = null; // Removing a left child - } else { - parent.rightChild = null; // Removing a right child - } - } // Case 2: Node with one child - else if (current.leftChild == null || current.rightChild == null) { - Node<T> child = (current.leftChild != null) ? current.leftChild : current.rightChild; - if (current == root) { - root = child; // Replace root with its child - } else if (parent.leftChild == current) { - parent.leftChild = child; // Replace parent's left child with the node's child - } else { - parent.rightChild = child; // Replace parent's right child with the node's child - } - } // Case 3: Node with two children - else { - Node<T> successor = getSuccessor(current); - current.data = successor.data; // Replace data with successor's data - // Remove successor node (successor will have at most one right child) - remove(successor.data); - } - - return true; } + // If node not found, return false + if (current == null) { + return false; + } + + // Case 1: Node with no children + if (current.leftChild == null && current.rightChild == null) { + if (current == root) { + root = null; // Removing root node + } else if (parent.leftChild == current) { + parent.leftChild = null; // Removing a left child + } else { + parent.rightChild = null; // Removing a right child + } + } // Case 2: Node with one child + else if (current.leftChild == null || current.rightChild == null) { + Node<T> child = (current.leftChild != null) ? current.leftChild : current.rightChild; + if (current == root) { + root = child; // Replace root with its child + } else if (parent.leftChild == current) { + parent.leftChild = child; // Replace parent's left child with the node's child + } else { + parent.rightChild = child; // Replace parent's right child with the node's child + } + } // Case 3: Node with two children + else { + Node<T> successorParent = current; + Node<T> successor = current.rightChild; + while (successor.leftChild != null) { + successorParent = successor; + successor = successor.leftChild; + } + current.data = successor.data; // Replace data with successor's data + if (successorParent == current) { + successorParent.rightChild = successor.rightChild; + } else { + successorParent.leftChild = successor.rightChild; + } + } + + return true; +} + + // Helper method to find in-order successor of a node - private Node<T> getSuccessor(Node<T> node) { - Node<T> current = node.rightChild; + private Node<T> getSuccessor(Node<T> node) + { + Node<T> current = node.rightChild; Node<T> successorParent = node; Node<T> successor = node; @@ -170,94 +196,172 @@ table {color: #888888; background-color: #313335; font-family: monospace; font-w while (current != null) { successorParent = successor; successor = current; - current = current.leftChild; + current = current.leftChild; } // If the successor is not the right child of the node to be removed, // adjust the successor's parent's leftChild reference - if (successor != node.rightChild) { - successorParent.leftChild = successor.rightChild; - successor.rightChild = node.rightChild; + if (successor != node.rightChild) { + successorParent.leftChild = successor.rightChild; + successor.rightChild = node.rightChild; } return successor; } - public ListIterator<T> listIterator() { - //ListIterator it = new ListIterator<T>(); - return null; + // Inorder ListIterator + public Iterator<T> listIterator() + { + return new InorderIterator(); } - public void breadthFirstTraversal() { - if (root == null) { + 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); + queue.offer(root); while (!queue.isEmpty()) { Node<T> current = queue.poll(); - System.out.print(current.data + " "); + System.out.print(current.data + " "); - if (current.leftChild != null) { - queue.offer(current.leftChild); + if (current.leftChild != null) { + queue.offer(current.leftChild); } - if (current.rightChild != null) { - queue.offer(current.rightChild); + 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); + public int height() + { + return calculateHeight(root); } - private int calculateHeight(Node<T> node) { + private int calculateHeight(Node<T> node) + { if (node == null) { return 0; } - int leftHeight = calculateHeight(node.leftChild); - int rightHeight = calculateHeight(node.rightChild); + int leftHeight = calculateHeight(node.leftChild); + int rightHeight = calculateHeight(node.rightChild); - return 1 + Math.max(leftHeight, rightHeight); + return 1 + Math.max(leftHeight, rightHeight); } - - public boolean isFullBST() { + + public boolean isFullBST() + { int height = height(); - int nodeCount = countNodes(root); + int nodeCount = countNodes(root); return nodeCount == (1 << height) - 1; // Formula for full binary tree } - private int countNodes(Node<T> node) { + private int countNodes(Node<T> node) + { if (node == null) { return 0; } - return 1 + countNodes(node.leftChild) + countNodes(node.rightChild); + return 1 + countNodes(node.leftChild) + countNodes(node.rightChild); } - - public void inorder() { - if (root == null) { + + public void inOrder() + { + if (root == null) { return; } Stack<Node<T>> stack = new Stack<>(); - Node<T> current = root; + Node<T> current = root; while (current != null || !stack.isEmpty()) { while (current != null) { stack.push(current); - current = current.leftChild; + current = current.leftChild; } current = stack.pop(); - System.out.print(current.data + " "); - current = current.rightChild; + System.out.print(current.data + " "); + current = current.rightChild; } } - public static void main(String[] args) { + public static void main(String[] args) throws CloneNotSupportedException + { TreeASDV<Integer> tree = new TreeASDV<>(); // Insert some elements into the tree tree.insert(5); @@ -269,20 +373,31 @@ table {color: #888888; background-color: #313335; font-family: monospace; font-w tree.insert(8); // Test breadth-first traversal - System.out.println("Breadth-First Traversal:"); + System.out.println("Breadth-First Traversal:"); tree.breadthFirstTraversal(); - System.out.println(); + System.out.println(); // Test height calculation - System.out.println("Height of the tree: " + tree.height()); + System.out.println("Height of the tree: " + tree.height()); // Test if the tree is a full binary tree - System.out.println("Is the tree a full binary tree? " + tree.isFullBST()); + System.out.println("Is the tree a full binary tree? " + tree.isFullBST()); // Test inorder traversal without recursion - System.out.println("Inorder Traversal without Recursion:"); - tree.inorder(); - System.out.println(); + 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(); } } diff --git a/Semester 4/Assignments/ProjectTrees_CalebFontenot/src/main/java/edu/slcc/asdv/caleb/projecttrees_calebfontenot/TreeASDV.java b/Semester 4/Assignments/ProjectTrees_CalebFontenot/src/main/java/edu/slcc/asdv/caleb/projecttrees_calebfontenot/TreeASDV.java index f84692b..f5eb493 100644 --- a/Semester 4/Assignments/ProjectTrees_CalebFontenot/src/main/java/edu/slcc/asdv/caleb/projecttrees_calebfontenot/TreeASDV.java +++ b/Semester 4/Assignments/ProjectTrees_CalebFontenot/src/main/java/edu/slcc/asdv/caleb/projecttrees_calebfontenot/TreeASDV.java @@ -98,57 +98,65 @@ public class TreeASDV implements Cloneable { return null; } - public boolean remove(T t) - { - // Initialize parent and current nodes for traversal - Node parent = null; - Node current = root; +public boolean remove(T t) { + // Initialize parent and current nodes for traversal + Node parent = null; + Node current = root; - // Search for the node to be removed - while (current != null && !current.data.equals(t)) { - parent = current; - if (t.compareTo(current.data) > 0) { - current = current.rightChild; - } else { - current = current.leftChild; - } + // Search for the node to be removed + while (current != null && !current.data.equals(t)) { + parent = current; + if (t.compareTo(current.data) > 0) { + current = current.rightChild; + } else { + current = current.leftChild; } - - // If node not found, return false - if (current == null) { - return false; - } - - // Case 1: Node with no children - if (current.leftChild == null && current.rightChild == null) { - if (current == root) { - root = null; // Removing root node - } else if (parent.leftChild == current) { - parent.leftChild = null; // Removing a left child - } else { - parent.rightChild = null; // Removing a right child - } - } // Case 2: Node with one child - else if (current.leftChild == null || current.rightChild == null) { - Node child = (current.leftChild != null) ? current.leftChild : current.rightChild; - if (current == root) { - root = child; // Replace root with its child - } else if (parent.leftChild == current) { - parent.leftChild = child; // Replace parent's left child with the node's child - } else { - parent.rightChild = child; // Replace parent's right child with the node's child - } - } // Case 3: Node with two children - else { - Node successor = getSuccessor(current); - current.data = successor.data; // Replace data with successor's data - // Remove successor node (successor will have at most one right child) - remove(successor.data); - } - - return true; } + // If node not found, return false + if (current == null) { + return false; + } + + // Case 1: Node with no children + if (current.leftChild == null && current.rightChild == null) { + if (current == root) { + root = null; // Removing root node + } else if (parent.leftChild == current) { + parent.leftChild = null; // Removing a left child + } else { + parent.rightChild = null; // Removing a right child + } + } // Case 2: Node with one child + else if (current.leftChild == null || current.rightChild == null) { + Node child = (current.leftChild != null) ? current.leftChild : current.rightChild; + if (current == root) { + root = child; // Replace root with its child + } else if (parent.leftChild == current) { + parent.leftChild = child; // Replace parent's left child with the node's child + } else { + parent.rightChild = child; // Replace parent's right child with the node's child + } + } // Case 3: Node with two children + else { + Node successorParent = current; + Node successor = current.rightChild; + while (successor.leftChild != null) { + successorParent = successor; + successor = successor.leftChild; + } + current.data = successor.data; // Replace data with successor's data + if (successorParent == current) { + successorParent.rightChild = successor.rightChild; + } else { + successorParent.leftChild = successor.rightChild; + } + } + + return true; +} + + // Helper method to find in-order successor of a node private Node getSuccessor(Node node) { @@ -360,5 +368,7 @@ public class TreeASDV implements Cloneable { 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(); } } diff --git a/Semester 4/ZIPs/ProjectTrees_CalebFontenot.zip b/Semester 4/ZIPs/ProjectTrees_CalebFontenot.zip new file mode 100644 index 0000000000000000000000000000000000000000..e4f7249f0ba1456e58fd6e5c70fb7338c75e0284 GIT binary patch literal 10203 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