⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myframemain.java

📁 基于图形的二叉树工作演示程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
  本程序用于演示检索二叉树的主要操作,结果通过图的形式显示在窗口的下部
*/

//MyFrameMain.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import myBag.*;                    //辅助包

/*
  类MyFrame用于演示检索二叉树主要操作的窗口界面。其中包含2个文本域,4个按钮,2个标签。 
4个按钮分别为"创建"、"查找"、"插入"、"删除"。
  "创建"按钮用于创建一棵检索二叉树。要求用户点击"创建"按钮前在输入文本域中输入数据,否则在输出文本域中报告出错提示。
  "查找"按钮用于查找指定关键码的元素。要求用户在查找前先创建一棵检索二叉树,并在输入文本域中输入数据,
否则在输出文本域中报告出错信息。若在查找过程中点击"查找"之外的按钮则不作为,并在输出文本域中报告出错提示。
  "插入"按钮用于插入指定关键码的元素。要求用户在插入前先创建一棵检索二叉树,并在输入文本域中输入数据,
否则在输出文本域中报告出错信息。若在插入过程中点击"插入"之外的按钮则不作为,并在输出文本域中报告出错提示。
  "删除"按钮用于删除指定关键码的元素。要求用户在删除前先创建一棵检索二叉树,并在输入文本域中输入数据,
否则在输出文本域中报告出错信息。若在删除过程中点击"删除"之外的按钮则不作为,并在输出文本域中报告出错提示。
*/

class MyFrame extends JFrame{
  private JButton b1,b2,b3,b4;     // 4个按钮
  private JTextField t1,t2;        //2个文本域
  private JLabel l1,l2;
  private Code code[]=new Code[63];
  private myVal array[]= new myVal[63];         //使顺序表足够大
  private LQueue lq= new LQueue();
   
/*
state是工作状态变量。其值定义如下:
0:初始状态;  1:创建状态;  2:查找状态;  3:插入状态;  4:删除状态。
*/

  int state=0;
  int width=700,height=500;        //窗口的大小
  //几个辅助参量
  int pos=0; 
  final int LEFT=-1, MID=0, RIGHT=1;
  int pp=2;
  boolean b=false,c=false;
    
  public MyFrame(){
    setTitle("演示检索二叉树的主要操作");
    
    for(int i=0;i<array.length;i++)
      array[i]=new myVal((new IElem(0)),(int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));
          
    code[0]=new Code(300,30);
    
    code[1]=new Code(150,70);   code[2]=new Code(450,70);
      
    code[3]=new Code(75,110);    code[4]=new Code(225,110);
    code[5]=new Code(375,110);   code[6]=new Code(525,110);

    code[7]=new Code(38,150);    code[8]=new Code(112,150);
    code[9]=new Code(188,150);   code[10]=new Code(262,150);
    code[11]=new Code(338,150);  code[12]=new Code(412,150);
    code[13]=new Code(488,150);  code[14]=new Code(562,150);
    
    code[15]=new Code(20,190);   code[16]=new Code(56,190);
    code[17]=new Code(94,190);   code[18]=new Code(130,190);
    code[19]=new Code(170,190);  code[20]=new Code(206,190);
    code[21]=new Code(244,190);  code[22]=new Code(280,190);
    code[23]=new Code(320,190);  code[24]=new Code(356,190);
    code[25]=new Code(394,190);  code[26]=new Code(430,190);
    code[27]=new Code(470,190);  code[28]=new Code(506,190);
    code[29]=new Code(544,190);  code[30]=new Code(580,190); 
    
    code[31]=new Code(11,230);   code[32]=new Code(29,230);
    code[33]=new Code(47,230);   code[34]=new Code(65,230);
    code[35]=new Code(85,230);   code[36]=new Code(103,230);
    code[37]=new Code(121,230);  code[38]=new Code(139,230);
    code[39]=new Code(161,230);  code[40]=new Code(179,230);
    code[41]=new Code(197,230);  code[42]=new Code(215,230);
    code[43]=new Code(235,230);  code[44]=new Code(253,230);
    code[45]=new Code(271,230);  code[46]=new Code(289,230);
    code[47]=new Code(311,230);  code[48]=new Code(329,230);
    code[49]=new Code(347,230);  code[50]=new Code(365,230);
    code[51]=new Code(385,230);  code[52]=new Code(403,230);
    code[53]=new Code(421,230);  code[54]=new Code(439,230);
    code[55]=new Code(461,230);  code[56]=new Code(479,230);
    code[57]=new Code(497,230);  code[58]=new Code(515,230);
    code[59]=new Code(535,230);  code[60]=new Code(553,230);
    code[61]=new Code(571,230);  code[62]=new Code(589,230);
                    
//创建"创建"、"查找"、"插入"、"删除"4个按钮
    b1=new JButton("创建");    b2=new JButton("查找");
    b3=new JButton("插入");    b4=new JButton("删除");

//为其安装事件监听器
    b1.addActionListener(new AL1());
    b2.addActionListener(new AL2());
    b3.addActionListener(new AL3());
    b4.addActionListener(new AL4());

    t1=new JTextField(5);                 //创建输入文本域
    t1.setText("");
    t1.setHorizontalAlignment(JTextField.CENTER);
    t1.setFont(new Font("楷体",Font.PLAIN,14));
    t1.setEditable(true);

    t2=new JTextField(35);                 //创建输出文本域
    t2.setHorizontalAlignment(JTextField.LEFT);
    t2.setFont(new Font("楷体",Font.PLAIN,16));
    t2.setText("请输入一个数");
    t2.setEditable(true);

    l1=new JLabel("演示检索二叉树的主要操作");
    l2=new JLabel("                     输入数据:");      //2个标签

//将上述组件安装入窗口
    JPanel pane1=new JPanel();
    pane1.setBackground(new Color(62,52,145));
    pane1.add(l1);            //第1个面板

    JPanel pane2=new JPanel();
    pane2.setBackground(new Color(62,52,145));
    pane2.add(b1);
    pane2.add(b2);
    pane2.add(b3);
    pane2.add(b4);
    pane2.add(l2);
    pane2.add(t1);             //第2个面板
    
    JPanel pane3=new JPanel();
    pane3.setBackground(new Color(62,52,145));
    pane3.add(t2);             //第3个面板
    
    JPanel pane4=new JPanel();
    pane4.setLayout(new BoxLayout(pane4,BoxLayout.Y_AXIS));
    pane4.add(pane1);
    pane4.add(pane2);
    pane4.add(pane3);          //第4个面板
    
    DisplayPanel pane5=new DisplayPanel();  //第5个面板
       
    Container contentPane=getContentPane();    //获得窗口的内容板
    contentPane.add(pane4,"North");
    contentPane.add(pane5,"Center");           //在内容板中添加各组件
    addWindowListener(new WL());               //添加窗口事件监听器
    setSize(width,height);                     //设置窗口大小
      
  }//构造方法MyFrame()声明结束

//该方法用于创建1棵检索二叉树
  public void myConstruct(myVal[]array, int n){
  	if(n<=0){
  	  t2.setText("添加的结点数必须是大于0的整数");
      return;	
  	}
    if(n>15){
      t2.setText("不宜添加这么多结点,请输入不超过15的整数");       //限制元素个数不超过15
      return;
    }    
    for(int i=0;i<array.length;i++) array[i].setIT(new IElem(0));
    IElem e[]=new IElem[n];
    int temp=0;
    for(int i=0;i<n;i++){
      temp=(int)(Math.random()*100);
      if(temp!=0) e[i]=new IElem(temp);
      else i--;
    }                                                //产生n个二位随机数元素
    for(int j=0;j<n;j++) constructhelp(array,e[j].key());     //调用辅助方法constucthelp(BinNode rt, int i)
    t2.setText("完成创建");
  }
  
  private myVal[] constructhelp(myVal[]array, int k){  
    int p=0;
    try{
      while(array[p].getIT().key()!=0){
      	if(k<array[p].getIT().key()) p=2*p+1;
      	else p=2*p+2;
      }
      array[p].setIT(new IElem(k));
    }catch(IndexOutOfBoundsException e){}
    return array;
  }
  
  //该方法用于查找关键码为k的元素
  public void myFind(myVal[]array, int k){
    if(array[0].getIT().key()==0){
      t2.setText("请先创建一棵二叉检索树");
      return;
    }
    if(array[pos].getIT().key()==0){
      t2.setText("没有要查找的元素");
      pos=0; 
      pp=MID;
      c=true;
      return;
    }
    else{
      if(k<array[pos].getIT().key()){
        pos=2*pos+1;
        pp=LEFT;
        t2.setText("前往左子结点");
      }
      else{
        if(k>array[pos].getIT().key()){
             pos=2*pos+2;
             pp=RIGHT;
             t2.setText("前往右子结点");
        }
        else if(k==array[pos].getIT().key()){
             t2.setText("找到要查找的元素");
             pos=0; 
             pp=MID;
             c=true;
             return;
        }
      }
    }
  }

//该方法用于插入关键码为k的元素
  public void myInsert(myVal[]array, int k){    
    if(array[pos].getIT().key()==0){
      pp=MID;
      array[pos].setIT(new IElem(k));
      t2.setText("完成插入");
      pos=0;
      repaint();
    }
    else{
      if(k<array[pos].getIT().key()){
        pos=2*pos+1;
        pp=LEFT;
        t2.setText("前往左子结点");
      }
      else{
        pos=2*pos+2;
        pp=RIGHT;
        t2.setText("前往右子结点");
      }
    }
  }

//该方法用于删除关键码为i的元素
  public void myRemove(myVal[]array, int k){
    if(array[0].getIT().key()==0){t2.setText("请先创建一棵二叉检索树");return;}
    if(array[pos].getIT().key()==0){
      t2.setText("没有要删除的元素");
      pos=0; 
      state=0;
      pp=MID;
    }
    else{
      if(k<array[pos].getIT().key()){
        pos=2*pos+1;
        pp=LEFT;
        t2.setText("前往左子结点");
      }
      else{
        if(k>array[pos].getIT().key()){
          pos=2*pos+2;
          pp=RIGHT;
          t2.setText("前往右子结点");
        }
        else{
          if(k==array[pos].getIT().key()){               //找到要删除的元素
            pp=MID;
            array[pos].setIT(new IElem(0));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -