diff --git a/05/Aufgabenstellung Praktikum 05.pdf b/05/Aufgabenstellung Praktikum 05.pdf new file mode 100644 index 0000000..083ecf4 Binary files /dev/null and b/05/Aufgabenstellung Praktikum 05.pdf differ diff --git a/05/src/main/java/ch/zhaw/ads/SortedBinaryTree.java b/05/src/main/java/ch/zhaw/ads/SortedBinaryTree.java new file mode 100644 index 0000000..194a1c6 --- /dev/null +++ b/05/src/main/java/ch/zhaw/ads/SortedBinaryTree.java @@ -0,0 +1,130 @@ +package Praktikum_05_Code; + +import java.util.*; + +public class SortedBinaryTree> implements Tree { + protected TreeNode root; + + private TreeNode insertAt(TreeNode node, T x) { + if (node == null) { + return new TreeNode(x); + } else { + if (x.compareTo(node.element) <= 0) { + node.left = insertAt(node.left, x); + } else { + node.right = insertAt(node.right, x); + } + return node; + } + } + + public void add(T x) { + root = insertAt(root, x); + } + + // find node to replace + private TreeNode findRepAt(TreeNode node, TreeNode rep) { + if (node.right != null) { + node.right = findRepAt(node.right,rep); + } else { + rep.element = node.element; + node = node.left; + } + return node; + } + + // remove node + private TreeNode removeAt(TreeNode node, T x,TreeNode removed ) { + if (node == null) { + return null; + } else { + if (x.compareTo(node.element) == 0) { + // found + removed.element = node.element; + if (node.left == null) { + node = node.right; + } else if (node.right == null) { + node = node.left; + } else { + node.left = findRepAt(node.left,node); + } + } else if (x.compareTo(node.element) < 0) { + // search left + node.left = removeAt(node.left, x, removed); + } else { + // search right + node.right = removeAt(node.right, x, removed); + } + return node; + } + } + + public T remove(T x) { + TreeNode removed = new TreeNode(null); + root = removeAt(root, x, removed); + return removed.element; + } + + + public boolean isEmpty() { + return root == null; + } + + public Traversal traversal() { + // to be implemented + } + + protected int calcHeight(TreeNode node) { + // to be implemented + } + + + protected int calcSize(TreeNode p) { + // to be implemented + } + + public int height() { + return calcHeight(root); + } + + public int size() { + return calcSize(root); + } + + public boolean balanced() { + throw new UnsupportedOperationException(); + } + + // only for testing and debugging purposes: show the structure of the tree + public String printTree() { + StringBuilder out = new StringBuilder(); + if (root.right != null) { + printTree(root.right,out, true, ""); + } + out.append(root.element+"\n"); + if (root.left != null) { + printTree(root.left,out, false, ""); + } + return out.toString(); + } + + private void printTree(TreeNode node, StringBuilder out, boolean isRight, String indent) { + if (node.right != null) { + printTree(node.right, out, true, + indent + (isRight ? " " : " | ")); + } + out.append(indent); + if (isRight) { + out.append(" /"); + } else { + out.append(" \\"); + } + out.append("----- "); + out.append(node.element+"\n"); + if (node.left != null) { + printTree(node.left, out, false, + indent + (isRight ? " | " : " ")); + } + } + +} diff --git a/05/src/main/java/ch/zhaw/ads/Traversal.java b/05/src/main/java/ch/zhaw/ads/Traversal.java new file mode 100644 index 0000000..37e3cfd --- /dev/null +++ b/05/src/main/java/ch/zhaw/ads/Traversal.java @@ -0,0 +1,13 @@ +package Praktikum_05_Code; + +/* interface of Traversal ADT */ +public interface Traversal { + /* traverse elements of tree in preorder */ + public void preorder(Visitor vistor); + /* traverse elements of tree in inorder */ + public void inorder(Visitor vistor); + /* traverse elements of tree in postorder */ + public void postorder(Visitor vistor); + /* traverse elements of tree in levelorder */ + public void levelorder(Visitor vistor); +} diff --git a/05/src/main/java/ch/zhaw/ads/Tree.java b/05/src/main/java/ch/zhaw/ads/Tree.java new file mode 100644 index 0000000..7a43e57 --- /dev/null +++ b/05/src/main/java/ch/zhaw/ads/Tree.java @@ -0,0 +1,19 @@ +package Praktikum_05_Code; + +/* interface of Tree ADT */ +public interface Tree { + /* add an element to the tree */ + void add(T o); + /* remove an element; returns the element if found else return null */ + T remove(T o); + /* test if tree is empty */ + boolean isEmpty(); + /* returns instance of class that implements traversal interface */ + Traversal traversal(); + /* number of elements */ + int size(); + /* height of the tree */ + int height(); + /* is the tree balanced */ + boolean balanced(); +} diff --git a/05/src/main/java/ch/zhaw/ads/TreeNode.java b/05/src/main/java/ch/zhaw/ads/TreeNode.java new file mode 100644 index 0000000..a83522a --- /dev/null +++ b/05/src/main/java/ch/zhaw/ads/TreeNode.java @@ -0,0 +1,19 @@ +package Praktikum_05_Code; + +class TreeNode> { + T element; + TreeNode left, right; + int height; + int count; + + TreeNode(T element){ + this.element = element; + this.count = 1; + this.height = 1; + } + TreeNode(T element, TreeNode left, TreeNode right){ + this(element); this.left = left; this.right = right; + } + + T getValue(){return element;} +} \ No newline at end of file diff --git a/05/src/main/java/ch/zhaw/ads/TreeTraversal.java b/05/src/main/java/ch/zhaw/ads/TreeTraversal.java new file mode 100644 index 0000000..a23458d --- /dev/null +++ b/05/src/main/java/ch/zhaw/ads/TreeTraversal.java @@ -0,0 +1,23 @@ +package Praktikum_05_Code; + +public class TreeTraversal> implements Traversal { + + private TreeNode root; + + public TreeTraversal(TreeNode root) { + this.root = root; + } + + public void inorder(Visitor vis) { + // to be done + } + + public void preorder(Visitor vis) { + // to be done + } + + public void postorder(Visitor vis) { + // to be done + } + +} diff --git a/05/src/main/java/ch/zhaw/ads/Visitor.java b/05/src/main/java/ch/zhaw/ads/Visitor.java new file mode 100644 index 0000000..7e780cc --- /dev/null +++ b/05/src/main/java/ch/zhaw/ads/Visitor.java @@ -0,0 +1,7 @@ +package Praktikum_05_Code; + +/* interface of visitor ADT */ +public interface Visitor { + /* called for each element in the tree */ + public void visit(T obj); +} diff --git a/05/src/test/java/ch/zhaw/ads/TreeTest.java b/05/src/test/java/ch/zhaw/ads/TreeTest.java new file mode 100644 index 0000000..3b3fbe4 --- /dev/null +++ b/05/src/test/java/ch/zhaw/ads/TreeTest.java @@ -0,0 +1,63 @@ +package Praktikum_05_Code; + +import org.junit.Test; +import org.junit.Before; +import static org.junit.Assert.*; + +public class TreeTest { + Tree tree; + + @Before + public void setUp() throws Exception { + tree = new SortedBinaryTree(); + tree.add("B"); + tree.add("A"); + tree.add("C"); + tree.add("D"); + } + + @Test + public void testInorder() { + Visitor v = new MyVisitor(); + tree.traversal().inorder(v); + assertEquals("inorder", "ABCD", v.toString()); + } + + @Test + public void testPreorder() { + Visitor v = new MyVisitor(); + tree.traversal().preorder(v); + assertEquals("preorder", "BACD", v.toString()); + } + + @Test + public void testPostorder() { + Visitor v = new MyVisitor(); + tree.traversal().postorder(v); + assertEquals("postorder", "ADCB", v.toString()); + } + + @Test + public void testLevelorder() { + Visitor v = new MyVisitor(); + tree.traversal().levelorder(v); + assertEquals("levelorder", "BACD", v.toString()); + } +} + + +class MyVisitor implements Visitor { + StringBuilder output; + + MyVisitor() { + output = new StringBuilder(); + } + + public void visit(T s) { + output.append(s); + } + + public String toString() { + return output.toString(); + } +} \ No newline at end of file