package lab07;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.*;
import sun.security.action.GetLongAction;
class BSTNode {
int nodeValue;
int nodeDepth;
BSTNode parent, leftChild, rightChild;
int levelOrderPosition;
int inOrderSequence;
BSTNode( int nodeValue, int nodeDepth ){
this.nodeValue = nodeValue;
this.nodeDepth = nodeDepth;
parent = leftChild = rightChild = null;
}
void setLeftChild( BSTNode leftChild ){
this.leftChild = leftChild;
if( leftChild != null ) leftChild.parent = this;
}
void setRightChild( BSTNode rightChild ){
this.rightChild = rightChild;
if( rightChild != null ) rightChild.parent = this;
}
void setLevelOrderPosition( int levelOrderPosition ){
this.levelOrderPosition = levelOrderPosition;
}
void setInOrderSequence(int inOrderSequence){
this.inOrderSequence = inOrderSequence;
}
int getNodeValue(){ return nodeValue; }
int getNodeDepth(){ return nodeDepth; }
int getLevelOrderPosition(){ return levelOrderPosition; }
int getInOrderSequence(){ return inOrderSequence; }
BSTNode getParent(){ return parent; }
BSTNode getLeftChild(){ return leftChild; }
BSTNode getRightChild(){ return rightChild; }
}
public class BST {
BSTNode rootNode;
int inOrderCounter;
int [] dataArray;
BST(){ rootNode = null; }
void bulkInsertOptimal( int [] dataArray ){
quicksort(dataArray, 0, dataArray.length - 1);
dataArray = removeDuplicates(dataArray);
rootNode = createSubTree(0, dataArray, 0, dataArray.length - 1);
this.dataArray = dataArray;
}
BSTNode createSubTree(int subTreeDepth, int [] dataArray,
int startIndex, int endIndex){
if( startIndex > endIndex )
return null;
int midIndex = (startIndex + endIndex)/2;
BSTNode subTreeRoot = /*???*/;
BSTNode leftSubTree = /*???*/;
BSTNode rightSubTree = /*???*/;
subTreeRoot.setLeftChild(leftSubTree);
subTreeRoot.setRightChild(rightSubTree);
return subTreeRoot;
}
public void addGraphicsLabVersion(Graphics g, int window_w, int window_h){
LinkedList<BSTNode> levelOrderQueue = new LinkedList<BSTNode>();
int curDepth = -1;
int levelOrderPosition = 0;
levelOrderQueue.add(rootNode);
while( !levelOrderQueue.isEmpty() ){
BSTNode curNode = levelOrderQueue.remove();
if( curNode.getNodeDepth() != curDepth ){
levelOrderPosition = 0;
curDepth = curNode.getNodeDepth();
}
curNode.setLevelOrderPosition(levelOrderPosition);
int curNode_x = /*???*/;
int curNode_y = /*???*/;
drawNumberCircle(g, curNode.getNodeValue(), curNode_x, curNode_y);
if( curDepth != 0 ){
BSTNode parentNode = curNode.getParent();
int parentNode_x = /*???*/;
int parentNode_y = /*???*/;
drawLine(g, curNode_x, curNode_y, parentNode_x, parentNode_y);
}
levelOrderPosition++;
if( curNode.getLeftChild() != null )
levelOrderQueue.add(curNode.getLeftChild());
if( curNode.getRightChild() != null )
levelOrderQueue.add(curNode.getRightChild());
}
}
void inOrderTraversal( BSTNode treeNode ){
}
public void addGraphicsHWVersion(Graphics g, int window_w, int window_h){
}
static int node_diameter = 40;
public void displayDataArray(Graphics g, int window_w, int window_h){
int y_offset = node_diameter;
int x_offset = (window_w - node_diameter * dataArray.length)/2;
for( int i = 0; i < dataArray.length; i++ )
{
g.setColor(Color.ORANGE);
g.drawRect(x_offset, y_offset , node_diameter , node_diameter );
g.setColor(Color.RED);
g.setFont(new Font("Verdana",Font.BOLD,15));
int x = x_offset + node_diameter/2 - 12;
int y = y_offset + node_diameter/2 + 5;
g.drawString(""+dataArray[i], x , y);
g.setColor(Color.BLUE);
g.drawString(""+i, x, y + node_diameter);
x_offset += node_diameter;
}
}
int getNodeX(int xPosition){
return (int)(1.2 * node_diameter * xPosition) + node_diameter;
}
int getNodeY(int nodeDepth){
return 2 * node_diameter * nodeDepth + (int)(3.5 * node_diameter);
}
void drawNumberCircle(Graphics g, int node_value, int node_x, int node_y)
{
g.setColor(Color.ORANGE);
g.fillOval( node_x, node_y, node_diameter, node_diameter );
g.setColor(Color.RED);
g.setFont(new Font("Verdana",Font.BOLD,15));
g.drawString( ""+node_value, node_x + node_diameter/2 - 12, node_y + node_diameter/2 +5 );
}
void drawLine( Graphics g, int node1_x, int node1_y, int node2_x, int node2_y)
{
int radius = node_diameter / 2;
int x1 = node1_x + radius;
int y1 = node1_y + radius;
int x2 = node2_x + radius;
int y2 = node2_y + radius;
double dist = Math.sqrt(Math.pow((x1 - x2), 2)+Math.pow((y1 - y2), 2));
double alpha1 = radius / dist;
double alpha2 = (dist - radius) / dist;
int xn1 = (int)(alpha1 * x1 + (1 - alpha1) * x2);
int yn1 = (int)(alpha1 * y1 + (1 - alpha1) * y2);
int xn2 = (int)(alpha2 * x1 + (1 - alpha2) * x2);
int yn2 = (int)(alpha2 * y1 + (1 - alpha2) * y2);
g.setColor(Color.GRAY);
g.drawLine(xn1, yn1, xn2, yn2);
}
int [] removeDuplicates( int [] sortedArray ){
int [] uniquesArray = null;
int uniqueCount = 0;
for( int pass = 1; pass <= 2; pass++ ){
if( pass == 2 )
uniquesArray = new int[uniqueCount];
int i = 0, j = 0;
while( i < sortedArray.length ){
if( pass == 1 )
uniqueCount++;
else
uniquesArray[j++] = sortedArray[i];
i++;
while( i < sortedArray.length && sortedArray[i] == sortedArray[i-1] )
i++;
}
}
return uniquesArray;
}
void quicksort (int [] A, int a, int b) {
if (a < b)
{
int pivot = A[b];
int l = a;
int r = b-1;
while (l <= r) {
while (l <= r && A[l] <= pivot)
l++;
while (l <= r && A[r] >= pivot)
r--;
if (l < r){
int temp = A[l]; A[l] = A[r]; A[r] = temp;
}
}
int temp = A[l]; A[l] = A[b]; A[b] = temp;
quicksort (A, a, l-1);
quicksort (A, l + 1, b);
}
}
}
|