import java.awt.*; import se.lth.cs.ad.drawing.*; public class BSTVisualizer { private DrawingArea canvas; // diameter of nodes; private final static int DIAMETER = 20; // horizontal distance between nodes on same level private final static int HORIZONTAL_DIST = 10; // vertical distance between levels private final static int VERTICAL_DIST = 10; // distance between node (circle) center and content string private final static int OFFSET = -10; /** * Create a canvas with a certain title, width, height. */ public BSTVisualizer(String title, int width, int height) { canvas = new DrawingArea(title, width, height, Color.YELLOW); } public static void main(String[] args) { BinarySearchTree t = new BinarySearchTree( ); /* t.insert( new Integer( 2 )); t.insert( new Integer( 1 )); t.insert( new Integer( 3 )); t.insert( new Integer( 4 )); t.insert( new Integer( 2 )); t.insert( new Integer( 1 )); t.insert( new Integer( 3 )); t.insert( new Integer( 6 )); t.insert( new Integer( 5 )); t.insert( new Integer( 7 )); */ t.insert( new Integer( 8 )); t.insert( new Integer( 4 )); t.insert( new Integer( 2 )); t.insert( new Integer( 1 )); t.insert( new Integer( 3 )); t.insert( new Integer( 6 )); t.insert( new Integer( 5 )); t.insert( new Integer( 7 )); t.insert( new Integer( 12 )); t.insert( new Integer( 10 )); t.insert( new Integer( 9 )); t.insert( new Integer( 11 )); t.insert( new Integer( 14 )); t.insert( new Integer( 13 )); t.insert( new Integer( 15 )); BSTVisualizer view = new BSTVisualizer("Algoritmer och datastrukturer äger! - David Wirsén och Fredrik Ullner", 500, 500); t.rebuild(); view.drawTree(t); } /** * Draw a binary search tree on the canvas. */ public void drawTree(BinarySearchTree bst) { drawTree(bst.getRoot(), 1, 3, bst.height()/2+1); } private void drawTree(BinaryNode node, int level, int height, int inOrderNbr) { if(node == null) return; int tempX = computeXpos(inOrderNbr); int tempY = computeYpos(level); int addX = 190; // Måste lägga till på X för att få en fin graf... canvas.fillCircle(Color.PINK, tempX+addX, tempY, DIAMETER); canvas.drawString((node.getElement()).toString(), tempX+addX+OFFSET, tempY+OFFSET); if(node.getLeft() != null) { canvas.drawLine(tempX+addX, tempY, computeXpos((int)(inOrderNbr-Math.pow(2, height-1)))+addX, computeYpos(level+1)); drawTree(node.getLeft(), level+1, height-1, (int)(inOrderNbr-Math.pow(2, height-1))); } if(node.getRight() != null) { canvas.drawLine(tempX+addX, tempY, computeXpos((int)(inOrderNbr+Math.pow(2, height-1)))+addX, computeYpos(level+1)); drawTree(node.getRight(), level+1, height-1, (int)(inOrderNbr+Math.pow(2, height-1))); } } /* ------ Private auxiliary methods --------------*/ /* Compute y-position of a node from its level. */ private int computeYpos(int level) { return level*(DIAMETER+VERTICAL_DIST); } /* Compute x-position of a node from its inordernumber. */ private int computeXpos(int actNodeNbr) { return actNodeNbr*(DIAMETER + HORIZONTAL_DIST); } }