All pastes #242875 Raw Edit

Untitled

public text v1 · immutable
·published 2006-11-07 20:28 UTC
rendered paste body
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);
    }
    
}