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);
}
}