[Previous page] [TwoThreetree.java] [Mystack.java] [NodeGUI.java]

/* *************************************************************************

*** 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
  }
 

}



[Previous page] [TwoThreetree.java] [Mystack.java] [NodeGUI.java]