80 likes | 96 Views
public class ABinTree implements BinTree{ private Object [] values; private Object EMPTY_NODE = new Object(); private int maxlength=100; private IntPos ROOT; public ABinTree() { values= new Object[maxlength]; ROOT = new IntPos(1);
E N D
public class ABinTree implements BinTree{ private Object [] values; private Object EMPTY_NODE = new Object(); private int maxlength=100; private IntPos ROOT; public ABinTree() { values= new Object[maxlength]; ROOT = new IntPos(1); values[ROOT.ip]=EMPTY_NODE; } public ABinTree(int max) { maxlength =max; values= new Object[maxlength]; ROOT = new IntPos(1); values[ROOT.ip]=EMPTY_NODE; } public Pos insertLeft(Pos p) { values[((IntPos)p).ip*2]=EMPTY_NODE; return new IntPos(((IntPos)p).ip*2); } public Pos insertRight(Pos p){ values[((IntPos)p).ip*2+1]=EMPTY_NODE; return new IntPos(((IntPos)p).ip*2+1); } public void setLabel(Object o,Pos p) { values[((IntPos)p).ip]=o; } public boolean isEmpty() { return (values[((IntPos)ROOT).ip] == EMPTY_NODE) && (values[((IntPos)ROOT).ip+1] == null) && (values[((IntPos)ROOT).ip+2] == null); } ABinTree.java
public boolean hasLeftChild(Pos p){ return values[((IntPos)p).ip*2] !=null; } public boolean hasRightChild(Pos p){ return values[((IntPos)p).ip*2+1] !=null; } public boolean hasLabel(Pos p) { return values[((IntPos)p).ip] != EMPTY_NODE; } public Object inspectLabel(Pos p){ return values[((IntPos)p).ip]; } public Pos root () { return ((Pos)ROOT); } public Pos leftChild(Pos p){ return new IntPos(((IntPos)p).ip*2); } public Pos rightChild(Pos p){ return new IntPos(((IntPos)p).ip*2+1); } public Pos parent(Pos p){ return new IntPos(((IntPos)p).ip/2); } public Pos deleteNode(Pos p) { //Must be a leaf and can not be the root values[((IntPos)p).ip]=null; return parent(p); } ABinTree.java
public void printOut(){ if (!isEmpty()) printOut(root()); } private void printOut(Pos p){ String str; if (hasLabel(p)){ str = "rot: " + inspectLabel(p); }else{ str = "TOM"; } System.out.println(str); if (hasLeftChild(p)){ System.out.println("Vänster barn till " + str); printOut(leftChild(p)); } if (hasRightChild(p)){ System.out.println("Höger barn till " + str); printOut(rightChild(p)); } } protected class IntPos implements Pos { int ip; private IntPos (int ip) { this.ip =ip; } public boolean eq(Pos p) { return (((IntPos)p).ip == this.ip; } }// IntPos }//ABinTree ABinTree.java
public class OTree implements OrderedTree{ protected Node root; public OTree() { root = new Node(null,null,null,null); } public Pos insertFirstChild (Pos p){ Node el; el = new Node((Node)p,null,null,null); ((Node)p).firstchild=el; return el; } public Pos root() { return root; } public Pos parent(Pos p) { return ((Node)p).parent; } public Pos firstChild(Pos p) { return ((Node)p).firstchild; } public Pos nextSibling(Pos p) { return ((Node)p).nextsibling; } public void setLabel(Object o,Pos p){ ((Node)p).label=o; } public Object inspectLabel(Pos p) { return ((Node)p).label; } OTree.java
public boolean hasLabel(Pos p) { return ((Node)p).label != null; } public Pos insertNextSibling(Pos p){ Node el; el = new Node(((Node)p).parent,null,(Node)p, ((Node)p).nextsibling); ((Node)p).nextsibling = el; return el; } public Pos deleteNode(Pos p){ ((Node)p).prevsibling.nextsibling = ((Node)p).nextsibling; return ((Node)p).nextsibling; } public boolean isRoot(Pos p) { return root.eq(p); } public boolean isLeaf(Pos p) { return ((Node)p).firstchild == null; } public boolean isLastSibling(Pos p) { return ((Node)p).nextsibling ==null; } public boolean isEmpty(){ return (root.firstchild == null) && (root.label == null); } OTree.java
public void printOut(){ if (!isEmpty()){ printOut(root()); } } private void printOut(Pos p){ if (hasLabel(p)) System.out.println(inspectLabel(p)); else System.out.println("TOM"); if (!isLeaf(p)){ System.out.println("->"); Pos p2 = firstChild(p); printOut(p2); while (!isLastSibling(p2)){ p2 = nextSibling(p2); printOut(p2); } System.out.println("<-"); } } public static void main(String [] args){ OTree tree = new OTree(); Pos p = tree.root(); tree.setLabel(new Integer(1), p); Pos p2 = tree.insertFirstChild(p); tree.setLabel(new Integer(2), p2); Pos p3 = tree.insertNextSibling(p2); tree.setLabel(new Integer(3), p3); p = p2; p2 = tree.insertFirstChild(p); tree.setLabel(new Integer(4), p2); p3 = tree.insertNextSibling(p2); tree.setLabel(new Integer(5), p3); tree.printOut(); } OTree.java
protected class Node implements Pos { protected Object label; protected Node nextsibling; protected Node prevsibling; protected Node parent; protected Node firstchild; protected Node(Node parent,Node firstchild, Node prev, Node next) { this.nextsibling = next; this.prevsibling= prev; this.parent=parent; this.firstchild=firstchild; } public boolean eq(Pos p) { return (((Node)p).nextsibling == this.nextsibling) && (((Node)p).prevsibling == this.prevsibling) && (((Node)p).parent == this.parent) && (((Node)p).firstchild == this.firstchild); } }// class Node }// class Otree OTree.java
public interface OrderedTree { public Pos insertFirstChild (Pos p); public Pos insertNextSibling (Pos p); public Pos root(); public Pos parent(Pos p); public Pos firstChild(Pos p); public Pos nextSibling(Pos p); void setLabel(Object o,Pos p); public Object inspectLabel(Pos p); public boolean hasLabel(Pos p); public Pos deleteNode(Pos p); } OrderedTree.java public interface BinTree { public Pos insertLeft(Pos p); public Pos insertRight(Pos p); public void setLabel(Object o,Pos p); public boolean isEmpty(); public boolean hasLeftChild(Pos p); public boolean hasRightChild(Pos p); public boolean hasLabel(Pos p); public Object inspectLabel (Pos p); public Pos root (); public Pos leftChild(Pos p); public Pos rightChild(Pos p); public Pos parent(Pos p); public Pos deleteNode(Pos p); } BinTree.java