From e1111bb1b9f37d030ebbb42efcb555b154ba32ce Mon Sep 17 00:00:00 2001 From: Giovanni Di Grezia Date: Mon, 5 May 2014 02:41:11 +0200 Subject: [PATCH] Heap Completed --- .../ArrayListCompleteBinaryTreeTest.java | 31 ++++ priorityqueue/MyEntry.java | 2 +- .../heap/ArrayListCompleteBinaryTree.java | 162 ++++++++++++------ 3 files changed, 138 insertions(+), 57 deletions(-) create mode 100644 com/xgiovio/ArrayListCompleteBinaryTreeTest.java diff --git a/com/xgiovio/ArrayListCompleteBinaryTreeTest.java b/com/xgiovio/ArrayListCompleteBinaryTreeTest.java new file mode 100644 index 0000000..2bcde21 --- /dev/null +++ b/com/xgiovio/ArrayListCompleteBinaryTreeTest.java @@ -0,0 +1,31 @@ +package com.xgiovio; + +import tree.binarytree.heap.ArrayListCompleteBinaryTree; + +/** + * Created with MONSTER. + * User: xgiovio + * Date: 05/05/2014 + * Time: 02:34 + */ +public class ArrayListCompleteBinaryTreeTest { + + public static void main(String[] args) { + + ArrayListCompleteBinaryTree a = new ArrayListCompleteBinaryTree(); + + System.out.println(a.isEmpty()); + System.out.println(a.size()); + a.add(15); + a.add(30); + a.add(25); + + System.out.println(a); + System.out.println(a.isEmpty()); + System.out.println(a.size()); + + + + + } +} diff --git a/priorityqueue/MyEntry.java b/priorityqueue/MyEntry.java index fe29598..f70ff48 100644 --- a/priorityqueue/MyEntry.java +++ b/priorityqueue/MyEntry.java @@ -28,7 +28,7 @@ public class MyEntry implements Entry { @Override public String toString() { - return ("" + key + " - " + value); + return ("(" + key + " - " + value + ")"); } private K key; diff --git a/tree/binarytree/heap/ArrayListCompleteBinaryTree.java b/tree/binarytree/heap/ArrayListCompleteBinaryTree.java index 20429c7..86907be 100644 --- a/tree/binarytree/heap/ArrayListCompleteBinaryTree.java +++ b/tree/binarytree/heap/ArrayListCompleteBinaryTree.java @@ -1,10 +1,13 @@ package tree.binarytree.heap; +import arraylist.ArrayIndexList; import arraylist.IndexList; import exceptions.BoundaryViolationException; import exceptions.EmptyTreeException; import exceptions.InvalidPositionException; +import position.NodePositionList; import position.Position; +import position.PositionList; import java.util.Iterator; @@ -18,6 +21,13 @@ public class ArrayListCompleteBinaryTree implements CompleteBinaryTree { IndexList> T; + + public ArrayListCompleteBinaryTree() { + T = new ArrayIndexList>(); + T.add(0, null); // the location at rank 0 is deliberately empty + } + + public E remove() throws EmptyTreeException { if(isEmpty()) throw new EmptyTreeException("L’albero è vuoto"); return T.remove(size()).element(); @@ -31,98 +41,112 @@ public class ArrayListCompleteBinaryTree implements CompleteBinaryTree { } - @Override + public int size() { return T.size() -1; } - @Override + public boolean isEmpty() { return (size() == 0); } - - - - - @Override - public Position left(Position v) throws InvalidPositionException, BoundaryViolationException { - return null; + public Position left(Position v) throws InvalidPositionException, BoundaryViolationException { + if (!hasLeft(v)) + throw new BoundaryViolationException("No left child"); + BTPos vv = checkPosition(v); + return T.get(2*vv.index()); } - @Override - public Position right(Position v) throws InvalidPositionException, BoundaryViolationException { - return null; + public Position right(Position v) throws InvalidPositionException { + if (!hasRight(v)) + throw new BoundaryViolationException("No right child"); + BTPos vv = checkPosition(v); + return T.get(2*vv.index() + 1); } - @Override public boolean hasLeft(Position v) throws InvalidPositionException { - return false; + BTPos vv = checkPosition(v); + return 2*vv.index() <= size(); } - - @Override + /** Returns whether v has a right child. */ public boolean hasRight(Position v) throws InvalidPositionException { - return false; + BTPos vv = checkPosition(v); + return 2*vv.index() + 1 <= size(); } - @Override + public Iterable> positions() { - return null; + IndexList> P = new ArrayIndexList>(); + Iterator> iter = T.iterator(); + iter.next(); // skip the first position + while (iter.hasNext()) + P.add(P.size(), iter.next()); + return P; } - @Override - public E replace(Position v, E e) throws InvalidPositionException { - return null; - } - @Override - public Position root() throws EmptyTreeException { - return null; - } - - @Override - public Position parent(Position v) throws InvalidPositionException, BoundaryViolationException { - return null; - } - - @Override - public Iterable> children(Position v) throws InvalidPositionException { - return null; - } - - @Override - public boolean isInternal(Position v) throws InvalidPositionException { - return false; - } - - @Override - public boolean isExternal(Position v) throws InvalidPositionException { - return false; - } - - @Override - public boolean isRoot(Position v) throws InvalidPositionException { - return false; - } - - @Override public Iterator iterator() { - return null; + IndexList list = new ArrayIndexList(); + Iterator> iter = T.iterator(); + iter.next(); // skip the first element + while (iter.hasNext()) + list.add(list.size(), iter.next().element()); + return list.iterator(); } + public E replace(Position v, E o) throws InvalidPositionException { + BTPos vv = checkPosition(v); + return vv.setElement(o); + } + + public Position root() throws EmptyTreeException { + if (isEmpty()) + throw new EmptyTreeException("Tree is empty"); + return T.get(1); + } + public Position parent(Position v) throws InvalidPositionException, BoundaryViolationException { + if (isRoot(v)) + throw new BoundaryViolationException("No parent"); + BTPos vv = checkPosition(v); + return T.get(vv.index()/2); + } + public Iterable> children(Position v) throws InvalidPositionException { + checkPosition(v); + PositionList> children = new NodePositionList>(); + if (hasLeft(v)) + children.addLast(left(v)); + if (hasRight(v)) + children.addLast(right(v)); + return children; + } + + public boolean isInternal(Position v) throws InvalidPositionException { + checkPosition(v); + return hasLeft(v); // if v has a right child it will have a left child + } + + public boolean isExternal(Position v) throws InvalidPositionException { + return !isInternal(v); + } + + public boolean isRoot(Position v) throws InvalidPositionException { + BTPos vv = checkPosition(v); + return vv.index() == 1; + } // check position protected BTPoscheckPosition(Position v) throws InvalidPositionException { - if (v == null || !(v instanceof BTPos)) + if (v == null || !(v instanceof BTPos) || isEmpty()) throw new InvalidPositionException("La posizione non è valida"); return (BTPos) v; } @@ -148,4 +172,30 @@ public class ArrayListCompleteBinaryTree implements CompleteBinaryTree { } + + public String toString() { + + Iterator it = iterator(); + + String to_return = ""; + to_return = to_return + "["; + + for (;it.hasNext();){ + E t = it.next(); + + if (it.hasNext()) { + + to_return+=(t.toString() + " , "); + } else { + + to_return+=(t.toString()); + } + } + + return to_return+= "]"; + } + + + + }