This commit is contained in:
navid.sassan 2020-10-25 20:50:06 +01:00
parent 690d96b8c4
commit 4751a42167
7 changed files with 272 additions and 272 deletions

@ -1,130 +1,130 @@
package Praktikum_05_Code; package Praktikum_05_Code;
import java.util.*; import java.util.*;
public class SortedBinaryTree<T extends Comparable<T>> implements Tree<T> { public class SortedBinaryTree<T extends Comparable<T>> implements Tree<T> {
protected TreeNode<T> root; protected TreeNode<T> root;
private TreeNode<T> insertAt(TreeNode<T> node, T x) { private TreeNode<T> insertAt(TreeNode<T> node, T x) {
if (node == null) { if (node == null) {
return new TreeNode<T>(x); return new TreeNode<T>(x);
} else { } else {
if (x.compareTo(node.element) <= 0) { if (x.compareTo(node.element) <= 0) {
node.left = insertAt(node.left, x); node.left = insertAt(node.left, x);
} else { } else {
node.right = insertAt(node.right, x); node.right = insertAt(node.right, x);
} }
return node; return node;
} }
} }
public void add(T x) { public void add(T x) {
root = insertAt(root, x); root = insertAt(root, x);
} }
// find node to replace // find node to replace
private TreeNode<T> findRepAt(TreeNode<T> node, TreeNode<T> rep) { private TreeNode<T> findRepAt(TreeNode<T> node, TreeNode<T> rep) {
if (node.right != null) { if (node.right != null) {
node.right = findRepAt(node.right,rep); node.right = findRepAt(node.right,rep);
} else { } else {
rep.element = node.element; rep.element = node.element;
node = node.left; node = node.left;
} }
return node; return node;
} }
// remove node // remove node
private TreeNode<T> removeAt(TreeNode<T> node, T x,TreeNode<T> removed ) { private TreeNode<T> removeAt(TreeNode<T> node, T x,TreeNode<T> removed ) {
if (node == null) { if (node == null) {
return null; return null;
} else { } else {
if (x.compareTo(node.element) == 0) { if (x.compareTo(node.element) == 0) {
// found // found
removed.element = node.element; removed.element = node.element;
if (node.left == null) { if (node.left == null) {
node = node.right; node = node.right;
} else if (node.right == null) { } else if (node.right == null) {
node = node.left; node = node.left;
} else { } else {
node.left = findRepAt(node.left,node); node.left = findRepAt(node.left,node);
} }
} else if (x.compareTo(node.element) < 0) { } else if (x.compareTo(node.element) < 0) {
// search left // search left
node.left = removeAt(node.left, x, removed); node.left = removeAt(node.left, x, removed);
} else { } else {
// search right // search right
node.right = removeAt(node.right, x, removed); node.right = removeAt(node.right, x, removed);
} }
return node; return node;
} }
} }
public T remove(T x) { public T remove(T x) {
TreeNode<T> removed = new TreeNode<T>(null); TreeNode<T> removed = new TreeNode<T>(null);
root = removeAt(root, x, removed); root = removeAt(root, x, removed);
return removed.element; return removed.element;
} }
public boolean isEmpty() { public boolean isEmpty() {
return root == null; return root == null;
} }
public Traversal<T> traversal() { public Traversal<T> traversal() {
// to be implemented // to be implemented
} }
protected int calcHeight(TreeNode<T> node) { protected int calcHeight(TreeNode<T> node) {
// to be implemented // to be implemented
} }
protected int calcSize(TreeNode p) { protected int calcSize(TreeNode p) {
// to be implemented // to be implemented
} }
public int height() { public int height() {
return calcHeight(root); return calcHeight(root);
} }
public int size() { public int size() {
return calcSize(root); return calcSize(root);
} }
public boolean balanced() { public boolean balanced() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
// only for testing and debugging purposes: show the structure of the tree // only for testing and debugging purposes: show the structure of the tree
public String printTree() { public String printTree() {
StringBuilder out = new StringBuilder(); StringBuilder out = new StringBuilder();
if (root.right != null) { if (root.right != null) {
printTree(root.right,out, true, ""); printTree(root.right,out, true, "");
} }
out.append(root.element+"\n"); out.append(root.element+"\n");
if (root.left != null) { if (root.left != null) {
printTree(root.left,out, false, ""); printTree(root.left,out, false, "");
} }
return out.toString(); return out.toString();
} }
private void printTree(TreeNode node, StringBuilder out, boolean isRight, String indent) { private void printTree(TreeNode node, StringBuilder out, boolean isRight, String indent) {
if (node.right != null) { if (node.right != null) {
printTree(node.right, out, true, printTree(node.right, out, true,
indent + (isRight ? " " : " | ")); indent + (isRight ? " " : " | "));
} }
out.append(indent); out.append(indent);
if (isRight) { if (isRight) {
out.append(" /"); out.append(" /");
} else { } else {
out.append(" \\"); out.append(" \\");
} }
out.append("----- "); out.append("----- ");
out.append(node.element+"\n"); out.append(node.element+"\n");
if (node.left != null) { if (node.left != null) {
printTree(node.left, out, false, printTree(node.left, out, false,
indent + (isRight ? " | " : " ")); indent + (isRight ? " | " : " "));
} }
} }
} }

@ -1,13 +1,13 @@
package Praktikum_05_Code; package Praktikum_05_Code;
/* interface of Traversal ADT */ /* interface of Traversal ADT */
public interface Traversal<T> { public interface Traversal<T> {
/* traverse elements of tree in preorder */ /* traverse elements of tree in preorder */
public void preorder(Visitor<T> vistor); public void preorder(Visitor<T> vistor);
/* traverse elements of tree in inorder */ /* traverse elements of tree in inorder */
public void inorder(Visitor<T> vistor); public void inorder(Visitor<T> vistor);
/* traverse elements of tree in postorder */ /* traverse elements of tree in postorder */
public void postorder(Visitor<T> vistor); public void postorder(Visitor<T> vistor);
/* traverse elements of tree in levelorder */ /* traverse elements of tree in levelorder */
public void levelorder(Visitor<T> vistor); public void levelorder(Visitor<T> vistor);
} }

@ -1,19 +1,19 @@
package Praktikum_05_Code; package Praktikum_05_Code;
/* interface of Tree ADT */ /* interface of Tree ADT */
public interface Tree<T> { public interface Tree<T> {
/* add an element to the tree */ /* add an element to the tree */
void add(T o); void add(T o);
/* remove an element; returns the element if found else return null */ /* remove an element; returns the element if found else return null */
T remove(T o); T remove(T o);
/* test if tree is empty */ /* test if tree is empty */
boolean isEmpty(); boolean isEmpty();
/* returns instance of class that implements traversal interface */ /* returns instance of class that implements traversal interface */
Traversal<T> traversal(); Traversal<T> traversal();
/* number of elements */ /* number of elements */
int size(); int size();
/* height of the tree */ /* height of the tree */
int height(); int height();
/* is the tree balanced */ /* is the tree balanced */
boolean balanced(); boolean balanced();
} }

@ -1,19 +1,19 @@
package Praktikum_05_Code; package Praktikum_05_Code;
class TreeNode<T extends Comparable<T>> { class TreeNode<T extends Comparable<T>> {
T element; T element;
TreeNode left, right; TreeNode left, right;
int height; int height;
int count; int count;
TreeNode(T element){ TreeNode(T element){
this.element = element; this.element = element;
this.count = 1; this.count = 1;
this.height = 1; this.height = 1;
} }
TreeNode(T element, TreeNode left, TreeNode right){ TreeNode(T element, TreeNode left, TreeNode right){
this(element); this.left = left; this.right = right; this(element); this.left = left; this.right = right;
} }
T getValue(){return element;} T getValue(){return element;}
} }

@ -1,23 +1,23 @@
package Praktikum_05_Code; package Praktikum_05_Code;
public class TreeTraversal<T extends Comparable<T>> implements Traversal<T> { public class TreeTraversal<T extends Comparable<T>> implements Traversal<T> {
private TreeNode<T> root; private TreeNode<T> root;
public TreeTraversal(TreeNode<T> root) { public TreeTraversal(TreeNode<T> root) {
this.root = root; this.root = root;
} }
public void inorder(Visitor<T> vis) { public void inorder(Visitor<T> vis) {
// to be done // to be done
} }
public void preorder(Visitor<T> vis) { public void preorder(Visitor<T> vis) {
// to be done // to be done
} }
public void postorder(Visitor<T> vis) { public void postorder(Visitor<T> vis) {
// to be done // to be done
} }
} }

@ -1,7 +1,7 @@
package Praktikum_05_Code; package Praktikum_05_Code;
/* interface of visitor ADT */ /* interface of visitor ADT */
public interface Visitor<T> { public interface Visitor<T> {
/* called for each element in the tree */ /* called for each element in the tree */
public void visit(T obj); public void visit(T obj);
} }

@ -1,63 +1,63 @@
package Praktikum_05_Code; package Praktikum_05_Code;
import org.junit.Test; import org.junit.Test;
import org.junit.Before; import org.junit.Before;
import static org.junit.Assert.*; import static org.junit.Assert.*;
public class TreeTest { public class TreeTest {
Tree<String> tree; Tree<String> tree;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
tree = new SortedBinaryTree<String>(); tree = new SortedBinaryTree<String>();
tree.add("B"); tree.add("B");
tree.add("A"); tree.add("A");
tree.add("C"); tree.add("C");
tree.add("D"); tree.add("D");
} }
@Test @Test
public void testInorder() { public void testInorder() {
Visitor<String> v = new MyVisitor<String>(); Visitor<String> v = new MyVisitor<String>();
tree.traversal().inorder(v); tree.traversal().inorder(v);
assertEquals("inorder", "ABCD", v.toString()); assertEquals("inorder", "ABCD", v.toString());
} }
@Test @Test
public void testPreorder() { public void testPreorder() {
Visitor<String> v = new MyVisitor<String>(); Visitor<String> v = new MyVisitor<String>();
tree.traversal().preorder(v); tree.traversal().preorder(v);
assertEquals("preorder", "BACD", v.toString()); assertEquals("preorder", "BACD", v.toString());
} }
@Test @Test
public void testPostorder() { public void testPostorder() {
Visitor<String> v = new MyVisitor<String>(); Visitor<String> v = new MyVisitor<String>();
tree.traversal().postorder(v); tree.traversal().postorder(v);
assertEquals("postorder", "ADCB", v.toString()); assertEquals("postorder", "ADCB", v.toString());
} }
@Test @Test
public void testLevelorder() { public void testLevelorder() {
Visitor<String> v = new MyVisitor<String>(); Visitor<String> v = new MyVisitor<String>();
tree.traversal().levelorder(v); tree.traversal().levelorder(v);
assertEquals("levelorder", "BACD", v.toString()); assertEquals("levelorder", "BACD", v.toString());
} }
} }
class MyVisitor<T> implements Visitor<T> { class MyVisitor<T> implements Visitor<T> {
StringBuilder output; StringBuilder output;
MyVisitor() { MyVisitor() {
output = new StringBuilder(); output = new StringBuilder();
} }
public void visit(T s) { public void visit(T s) {
output.append(s); output.append(s);
} }
public String toString() { public String toString() {
return output.toString(); return output.toString();
} }
} }