/* *************************************************************************
*** Filename:TreeGUI.java
Associated java files: NodeGUI.java, TwoThreetree.java,
Mystack.java
Compiler : JDK 1.1.4
*** °ú ¸ñ : ÈÀÏ󸮷Ð
*** ´ã´ç±³¼ö : ¹Ú¿µ¹è
*** ¸íÁö´ëÇб³ ÄÄÇ»ÅͰøÇаú 3Çг⠹ÎÁ¤½Ä
*** E-Mail : mxxk@uriel.net
*** Execute on(Refe. to) http://www.uriel.net/~mxxk/File/btree.html
*** **********************************************************************/
import java.applet.*;
import java.awt.*;
import java.lang.*;
import java.util.Random;
public class TreeGUI extends Applet
{
// Constant variables
// ³ÐÀÌ(WIDTH)¿Í ³ôÀÌ(HEIGHT)¸¦ º¯ÇüÇÒ¼ö ÀÖ´Ù
static final int TREESIZE = 40;
static final int WIDTH = 30;
static final int HEIGHT = 20;
static final int X_POS = WIDTH+4;
static final int Y_POS = HEIGHT+40;
// Global variables
private Font font;
Button insButton, delButton, clearButton, randTreeButton,
srchButton;
TextField number; // »ç¿ëÀÚ¿¡°Ô »ðÀÔ »èÁ¦Å°¸¦ ÀÔ·ÂÇÒ¼ö
ÀÖµµ·Ï ÇÔ
NodeGUI tree[];
TextArea comment;
TwoThreetree k = new TwoThreetree(100);
int nodearray[];
int MAXLEVEL = 20;
int nodepos[] = new int[MAXLEVEL];
int index = 0;
int thekey = -1; // °Ë»öÀ̳ª »èÁ¦¸¦ À§ÇÑ »ç¿ëÀÚÀÇ key¼±ÅÃ
int hi_key = -1; // ۸¦ Àß º¸À̵µ·Ï Ç¥½ÃÇÔ
Random randGen = new Random();
public void init()
{
// Ç¥½Ã¿µ¿ªÀÇ Å©±â
resize(X_POS*27, Y_POS*7);
int i;
// °´Ã¼ÀÇ Æ÷Æ® ÃʱâÈ
font = new Font("Helvetica", Font.PLAIN,
10);
// »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¸¦ À§ÇÑ ±×·¡ÇÈÀÎÅÍÆäÀ̽º
ÃʱâÈ
randTreeButton = new Button(" ¸¶±¸ÀâÀÌ
");
insButton = new Button(" »ðÀÔ ");
delButton = new Button(" »èÁ¦ ");
clearButton = new Button(" ±ú²ýÈ÷ ");
srchButton = new Button(" °Ë»ö ");
number = new TextField(15);
number.setText("");
comment = new TextArea("",7,35);
add(randTreeButton);
add(insButton);
add(delButton);
add(number);
add(srchButton);
add(clearButton);
add(comment);
// Æ®¸®¸¦ Æ÷±âÈ ÇÏ°í ³ëµå¸¦ ±ÕÇüÀÖµµ·Ï
ÇÒ´çÇÔ
tree = new NodeGUI[TREESIZE];
tree[0] = new NodeGUI(13*X_POS, 3*Y_POS,
WIDTH, HEIGHT, false);
tree[1] = new NodeGUI(4*X_POS, 4*Y_POS,
WIDTH, HEIGHT, false);
tree[2] = new NodeGUI(13*X_POS, 4*Y_POS,
WIDTH, HEIGHT, false);
tree[3] = new NodeGUI(22*X_POS, 4*Y_POS,
WIDTH, HEIGHT, false);
tree[4] = new NodeGUI(1*X_POS, 5*Y_POS,
WIDTH, HEIGHT, false);
tree[5] = new NodeGUI(4*X_POS, 5*Y_POS,
WIDTH, HEIGHT, false);
tree[6] = new NodeGUI(7*X_POS, 5*Y_POS,
WIDTH, HEIGHT, false);
tree[7] = new NodeGUI(10*X_POS, 5*Y_POS,
WIDTH, HEIGHT, false);
tree[8] = new NodeGUI(13*X_POS, 5*Y_POS,
WIDTH, HEIGHT, false);
tree[9] = new NodeGUI(16*X_POS, 5*Y_POS,
WIDTH, HEIGHT, false);
tree[10] = new NodeGUI(19*X_POS, 5*Y_POS,
WIDTH, HEIGHT, false);
tree[11] = new NodeGUI(22*X_POS, 5*Y_POS,
WIDTH, HEIGHT, false);
tree[12] = new NodeGUI(25*X_POS, 5*Y_POS,
WIDTH, HEIGHT, false);
for (i=0; i<27; i++)
tree[i+13] = new NodeGUI(i*X_POS,
6*Y_POS, WIDTH, HEIGHT, false);
// Áõ°¡µÉ ³ëµå¼ýÀÚ¸¦ ÀúÀåÇϰíÀÖ´Â ³ëµå ¹è¿À» ÃʱâÈÇÔ
nodearray = new int[TREESIZE];
comment.appendText("File Structure\n");
comment.appendText("B-Tree\n");
comment.appendText("MungJi University.\n");
comment.appendText("Dep. of Computer
enginerring.\n");
comment.appendText("By JungSig Min,
3th\n");
comment.appendText("-----------------------------\n");
ReInit();
}
public void paint(Graphics g)
{
int node;
String val1;
String val2;
g.setColor(this.getBackground());
g.fillRect(0, 3*Y_POS, X_POS*27, Y_POS*7);
g.setColor(Color.black);
for (int j = 0; nodearray[j]>-1; j++)
{
g.setColor(Color.black);
node=nodearray[j];
if (node ==
0)
g.drawRect(tree[0].x, tree[0].y, tree[0].width, tree[0].height);
else
{
g.drawRect(tree[node].x, tree[node].y,
tree[node].width, tree[node].height);
//
g.setColor(Color.green);
g.drawLine(tree[(node+2)/3-1].x + WIDTH/2, tree[(node+2)/3-1].y + HEIGHT,
tree[node].x + WIDTH/2, tree[node].y);
}
// ³ëµå¿¡ ÀúÀåµÈ
Á¤¼öÇüº¯¼ö Ç¥½Ã
g.setFont(font);
g.setColor(Color.blue);
val1 = String.valueOf(tree[node].lvalue);
if(tree[node].lvalue
<= 9) val1 = " "+val1;
if (tree[node].rvalue
== 0)
val2="-";
else
val2 = String.valueOf(tree[node].rvalue);
if(tree[node].rvalue <= 9) val2 = " "+val2;
if(tree[node].lvalue
== hi_key) // ¿ÞÂʰªÀ» °Á¶ Ç¥½ÃÇÔ
{
g.drawString(" ,"+val2, tree[node].x+2,tree[node].y+HEIGHT*2/3);
g.setColor(Color.red);
g.drawString(val1, tree[node].x+2, tree[node].y+HEIGHT*2/3);
hi_key = -1;
}
else if(tree[node].rvalue
== hi_key) // ¿À¸¥ÂʰªÀ» °Á¶ Ç¥½ÃÇÔ
{
g.setColor(Color.red);
g.drawString("
"+val2, tree[node].x+2,tree[node].y+HEIGHT*2/3);
g.setColor(Color.blue);
g.drawString(val1+",", tree[node].x+2, tree[node].y+HEIGHT*2/3);
hi_key = -1;
}
else
g.drawString(val1+","+val2,tree[node].x+2,tree[node].y+HEIGHT*2/3);
}
}
public boolean action(Event event, Object arg)
{
if (event.target == clearButton)
{
Graphics g = this.getGraphics();
g.setColor(this.getBackground());
g.fillRect(0, 3*Y_POS,
X_POS*27, Y_POS*7);
comment.setText("");
comment.appendText("File
Structure\n");
comment.appendText("B-Tree\n");
comment.appendText("MungJi
University.\n");
comment.appendText("Dep.
of Computer enginerring.\n");
comment.appendText("By
JungSig Min, 3th\n");
comment.appendText("-----------------------------\n");
comment.appendText("Clear
tree\n");
ReInit();
return true;
}
else if (event.target == randTreeButton)
{
comment.appendText("Create
random tree\n");
RandomInsert();
return true;
}
else if (event.target == insButton)
{
if (!number.getText().equals("")){
thekey = Integer.parseInt(number.getText());
if (thekey > 99)
comment.appendText("Key over 99 (1-99 only)\n");
else{
comment.appendText("Insert " + number.getText()+"\n");
Insert();
}
number.setText(""); // ÅØ½ºÆ®ÇÊµå ±ú²ýÈ÷ Áö¿ò
}
else // ¸¸ÀÏ Å°°¡
¼±ÅõÇÁö ¾Ê¾Ò´Ù¸é ·£´ý°ªÀ» »ðÀÔ
{
thekey = Math.abs(randGen.nextInt())%99+1;
comment.appendText("Insert Random key
"+String.valueOf(thekey)+"\n");
Insert();
}
return true;
}
else if (event.target == delButton)
{
if (!number.getText().equals("")){
thekey = Integer.parseInt(number.getText());
comment.appendText("Delete " + number.getText()+"\n");
Delete();
number.setText(""); // ÅØ½ºÆ®ÇÊµå ±ú²ýÈ÷ Áö¿ò
}
else
comment.appendText("Enter key for Del\n");
return true;
}
else if (event.target == srchButton)
{
if (!number.getText().equals("")){
thekey = Integer.parseInt(number.getText());
comment.appendText("Search for " + number.getText()+"\n");
if(k.Search23(thekey)) // ã´Â ۰ªÀÌ ¹ß°ßµÇ¾ú´Ù¸é..
{
comment.appendText(number.getText()+" FOUND in tree\n");
hi_key = thekey;
repaint();
}
else
comment.appendText(number.getText()+"
NOT FOUND in tree\n");
number.setText(""); // ÅØ½ºÆ®ÇÊµå ±ú²ýÈ÷ Áö¿ò
}
else
comment.appendText("Enter search key!\n");
return true;
}
else
return super.action(event,
arg);
}
public boolean keyDown (Event evt, int key)
{
if ((key >= '0') && (key <= '9'))
return false;
else
return true;
}
// 35۰ª±îÁö ·£´ý Æ®¸®¸¦ »ðÀÔ
public void RandomInsert()
{
int randomkey;
ReInit();
randomkey = Math.abs(randGen.nextInt())%99+1;
k.Insert23(randomkey);
for (int i = 1; i <35 ; i++)
{
while(k.Search23(randomkey = Math.abs(randGen.nextInt())%99+1));
k.Insert23(randomkey);
}
for (int j = 0; j<MAXLEVEL; j++) //
¸ðµç ³ëµåÀ§Ä¡¸¦ 0À¸·Î ÃʱâÈ
nodepos[j]=0;
index = 0;
NodeInfo(0, k.t);
repaint();
}
// ´Ù½Ã±×·ÁÁú ¸ðµç³ëµåµéÀ» À§ÇÑ À§Ä¡°è»ê
public void NodeInfo(int level, int ptr)
{
int nodenum=-1; // BÆ®¸®¿¡ »ó´ëÀûÀÎ ³ëµå¹øÈ£ÀÇ ½ÇÁ¦ÀûÀÎ
À§Ä¡
if(ptr == -1){
nodepos[level]++;
nodepos[level+1]+=3;
return;
}
nodepos[level]++;
switch(level){
case 0:
nodenum=0;
break;
case 1:
nodenum=1+nodepos[level]-1;
break;
case 2:
nodenum=4+nodepos[level]-1;
break;
case 3:
nodenum=13+nodepos[level]-1;
break;
}
if (nodenum >-1){
nodearray[index]=nodenum;
tree[nodenum].lvalue=k.tree[ptr].Ldata;
tree[nodenum].rvalue=k.tree[ptr].Rdata;
index++;
}
else{ // 4´Ü°è°¡ ³Ñ¾î°¡¸é ¿¡Çø´¿¡¼
¸ÂÃßÁö ¾Ê°í ³ëµå¸¦ Áö¿î´Ù
if ((k.tree[ptr].Ldata == thekey) ||
(k.tree[ptr].Rdata == thekey))
{
comment.appendText("CAN'T
INSERT!!!!!\n");
comment.appendText("Over
Display Limit!!!!!\n");
comment.appendText("Click
the clear tree button\n");
}
k.tree[ptr].Ldata = 0;
k.tree[ptr].Rdata = 0;
k.tree[ptr].left= -1;
k.tree[ptr].middle= -1;
k.tree[ptr].right= -1;
}
NodeInfo(level+1, k.tree[ptr].left);
NodeInfo(level+1, k.tree[ptr].middle);
NodeInfo(level+1, k.tree[ptr].right);
}
// ¸ðµç°ÍÀ» ´Ù½Ã ÃʱâÈÇÑ´Ù,(ºóÆ®¸®)
public void ReInit()
{
for (int i = 0; i < TREESIZE; i++)
{
tree[i].lvalue = 0;
tree[i].rvalue = 0;
nodearray[i] = -1;
ReInitTree(0, k.t);
k.t = -1;
k.stackindex = 1;
}
}
// ¸ðµç Æ®¸®¸¦ ºñ¿î´Ù
public void ReInitTree(int level, int ptr)
{
if(ptr == -1)
return;
k.tree[ptr].Ldata = 0;
k.tree[ptr].Rdata = 0;
ReInitTree(level+1, k.tree[ptr].left);
k.tree[ptr].left= -1;
ReInitTree(level+1, k.tree[ptr].middle);
k.tree[ptr].middle= -1;
ReInitTree(level+1, k.tree[ptr].right);
k.tree[ptr].right= -1;
}
// Á¤ÀÇµÈ Å°¸¦ »ðÀÔ
public void Insert()
{
if (k.Search23(thekey)) // ¸¸ÀÏ Å°°¡ ¹ß°ßµÇ¸é
¾Æ¹«°Íµµ ÇÏÁö ¾ÊÀ½
comment.appendText(String.valueOf(thekey)+"
ALREADY IN TREE\n");
else // ¸¸ÀÏ Å°°¡ ¹ß°ßµÇ¸é Æ®¸®¿¡ »ðÀÔ
{
hi_key = thekey; // set this key to be highlighted
k.Insert23(thekey);
for (int j = 0; j<MAXLEVEL; j++)
// ¸ðµç ³ëµåÀ§Ä¡¸¦ 0À¸·Î ÃʱâÈÇÔ
nodepos[j]=0;
for (int i = 0; i < TREESIZE; i++) // ¸ðµç
³ëµå¹è¿À» -1À¸·Î ÃʱâÈÇÔ
nodearray[i] = -1;
index = 0;
NodeInfo(0, k.t);
repaint();
thekey = -1; // reset thekey
}
}
// Á¤ÀÇµÈ Å°¸¦ »èÁ¦
public void Delete()
{
if(k.Search23(thekey)) // ۰ªÀÌ ¹ß°ßµÇ¸é »èÁ¦
{
k.Delete23(thekey);
for (int j = 0; j<MAXLEVEL; j++)
// ¸ðµç ³ëµåÀ§Ä¡¸¦ 0À¸·Î ÃʱâÈÇÔ
nodepos[j]=0;
for (int i = 0; i < TREESIZE; i++)
// ¸ðµç ³ëµå¹è¿À» -1À¸·Î ÃʱâÈÇÔ
nodearray[i] = -1;
index = 0; // ÀÎÅØ½º¸¦ 0À¸·Î ÃʱâÈ
if (k.tree[k.t].Ldata == 0) //
Æ®¸®°¡ ºñ¾ú´Ù¸é
ReInit();
else
NodeInfo(0, k.t);
// ¿¡Çø´ Ç¥½Ã¸¦À§ÇÑ ³ëµåÁ¤º¸ÀÇ Àç°è»ê
repaint();
}
else
comment.appendText(String.valueOf(thekey)+"
NOT FOUND!\n");
thekey = -1; // reset thekey
}
}