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

📄 myframemain.java

📁 基于图形的二叉树工作演示程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            if(array[2*pos+2].getIT().key()==0){         //没有右子
              int p=0;
              for(p=2*pos+1;p<array.length;p++){
                if(array[p].getIT().key()!=0){
                  if((p%2==1)&&(array[(p-1)/2].getIT().key()==0)){
                    array[(p-1)/2].setIT(new IElem(array[p].getIT().key()));
                    array[p].setIT(new IElem(0));
                  }
                  if((p%2==0)&&(array[p/2].getIT().key()==0)&&(array[(p-1)/2].getIT().key()==0)){
                    array[p/2].setIT(new IElem(array[p].getIT().key()));
                    array[p].setIT(new IElem(0));
                  }
                }
              }
            }
            else{                                //有右子
              int w=2*pos+2;
              while(array[2*w+1].getIT().key()!=0) w=2*w+1;
              array[pos].setIT(new IElem(array[w].getIT().key()));
              array[w].setIT(new IElem(0));
              int q=0;
              if(2*w+1<array.length){
                for(q=2*w+1;q<array.length;q++){
                  if(array[q].getIT().key()!=0){
                    if((q%2==1)&&(array[(q-1)/2].getIT().key()==0)){
                      array[(q-1)/2].setIT(new IElem(array[q].getIT().key()));
                      array[q].setIT(new IElem(0));
                    }
                    if((q%2==0)&&(array[q/2].getIT().key()==0)&&(array[(q-1)/2].getIT().key()==0)){
                      array[(q-2)/2].setIT(new IElem(array[q].getIT().key()));
                      array[q].setIT(new IElem(0));
                    }
                  }
                }
              }
            }
          }
          t2.setText("完成删除");
          pos=0; 
          repaint();
          }
        }
      }
    }

    
  class WL extends WindowAdapter{                //设置窗口事件监听器
    public void windowClosing(WindowEvent e){ System.exit(0);}
  }

//设置各按钮的动作监听器
  class AL1 implements ActionListener{ //设置"创建"按钮的动作监听器
    public void actionPerformed(ActionEvent ae){ 
      state=1;                        //1:创建状态
      if((t1.getText().equals(""))) t2.setText("请输入一个数");
      else{
        try{
          int i=Integer.valueOf(t1.getText()).intValue();
          if(state==1)myConstruct(array,i);
        }catch(NumberFormatException nfe){
        t2.setText("请确认输入的是一个整数");
        }
      }
      repaint();
    }
  }

  class AL2 implements ActionListener{ //设置"查找"按钮的动作监听器
    public void actionPerformed(ActionEvent ae){
      if((state!=0)&(state!=2)){t2.setText("请先执行完原操作");return;}
      if(array[0].getIT().key()==0){t2.setText("请先创建一棵二叉检索树");return;}
      if(state==0){
      	 state=2;                      //2:查找状态
      	 t2.setText("开始查找");
      	 b=true;
      	 repaint();
      }
      else{
        if((t1.getText().equals(""))) t2.setText("请输入一个数");
        else{
          try{
            int i=Integer.valueOf(t1.getText()).intValue();
            if(state==2){myFind(array,i);repaint();}
          }catch(NumberFormatException nfe){
          t2.setText("请确认输入的是一个整数");
          }
        }
      }
    }
  }

  class AL3 implements ActionListener{ //设置"插入"按钮的动作监听器
    public void actionPerformed(ActionEvent ae){ 
      if((state!=0)&(state!=3)){t2.setText("请先执行完原操作");return;}
      if(state==0){
      	 state=3;                      //3:插入状态
      	 t2.setText("开始插入");
      	 b=true;
      	 repaint();
      }
      else{
        if((t1.getText().equals(""))) t2.setText("请输入一个数");
        else{
          try{
            int i=Integer.valueOf(t1.getText()).intValue();
            if(state==3){myInsert(array,i);repaint();}
          }catch(NumberFormatException nfe){
          t2.setText("请确认输入的是一个整数");
          }
        }
      }
    }
  }

  class AL4 implements ActionListener{ //设置"删除"按钮的动作监听器
    public void actionPerformed(ActionEvent ae) { 
      if((state!=0)&(state!=4)){t2.setText("请先执行完原操作");return;}
      if(state==0){
      	 state=4;                        //4:删除状态
      	 t2.setText("开始删除");
      	 b=true;
      	 repaint();
      }
      else{                         
        if((t1.getText().equals(""))) t2.setText("请输入一个数");
        else{
          try{
            int i=Integer.valueOf(t1.getText()).intValue();
            if(state==4){myRemove(array,i);repaint();}
          }catch(NumberFormatException nfe){
          t2.setText("请确认输入的是一个整数");
          }
        }
      }
    }
  }

  class DisplayPanel extends JPanel{
    public void paintComponent(Graphics g){
      super.paintComponent(g);
      if(state==1){
      	draw_Tree(g,array);
      	state=0;
      }
      
      if(state==2){
      	draw_Tree(g,array);
      	if(b){
      	  b=false;
      	  draw_Tree(g,array);
      	  drawArrow(g,code[pos].getX()+6,code[pos].getY()-10); 
      	}
      	else{
      	  if(pp==LEFT){
      	    draw_Tree(g,array);
            g.clearRect(code[(pos-1)/2].getX(),code[(pos-1)/2].getY()-10,10,10);
            drawArrow(g,code[pos].getX()+6,code[pos].getY()-5); 
          }
          if(pp==RIGHT){
            draw_Tree(g,array);
            g.clearRect(code[(pos-2)/2].getX(),code[(pos-2)/2].getY()-10,10,10);
            drawArrow(g,code[pos].getX()+6,code[pos].getY()); 
          }
        }
        if(c) state=0;    
      }
      
      if(state==3){
      	draw_Tree(g,array);
      	if(b){
      	  b=false;
      	  draw_Tree(g,array);
      	  drawArrow(g,code[pos].getX()+6,code[pos].getY()-10); 
      	}
      	else{
      	  if(pp==MID){
      	    draw_Tree(g,array);     //调用辅助方法draw_Tree(Graphics g,IElem[]array)
            state=0;
            pp=2;
          }
          else{
            if(pp==LEFT){
              g.clearRect(code[(pos-1)/2].getX(),code[(pos-1)/2].getY()-10,10,10);
              drawArrow(g,code[pos].getX()+6,code[pos].getY()); 
            }
            if(pp==RIGHT){
              g.clearRect(code[(pos-2)/2].getX(),code[(pos-2)/2].getY()-10,10,10);
              drawArrow(g,code[pos].getX()+6,code[pos].getY()); 
            }
          }
        }
      }
      
      if(state==4){
      	draw_Tree(g,array);
      	if(b){
      	  b=false;
      	  draw_Tree(g,array);
      	  drawArrow(g,code[pos].getX()+6,code[pos].getY()-10); 
      	}
      	else{
      	  if(pp==MID){
      	    draw_Tree(g,array);     //调用辅助方法draw_Tree(Graphics g,IElem[]array)
            state=0;
            pp=2;
          }
          else{
            if(pp==LEFT){
              g.clearRect(code[(pos-1)/2].getX(),code[(pos-1)/2].getY()-10,10,10);
              drawArrow(g,code[pos].getX()+6,code[pos].getY()); 
            }
            if(pp==RIGHT){
              g.clearRect(code[(pos-2)/2].getX(),code[(pos-2)/2].getY()-10,10,10);
              drawArrow(g,code[pos].getX()+6,code[pos].getY()); 
            }
          }
        }
      }
      
    }
  }

  private void draw_Tree(Graphics g,myVal[] array){
    for(int k=0; k<63; k++){
      if(array[k].getIT().key()==0){}      //a中元素关键码为0,不画图
      else{
        g.setColor(Color.black);
        g.drawOval(code[k].getX(),code[k].getY(),20,20);    //画圆
        g.setColor(new Color(array[k].getR(),array[k].getG(),array[k].getB()));
        g.fillOval(code[k].getX(),code[k].getY(),20,20);    //填充圆
        g.setColor(Color.black);
        g.drawString(String.valueOf(array[k].getIT().key()),code[k].getX(),code[k].getY()+13); //标注元素关键码值
      }
    }
    for(int j=0; j<31; j++){    
      if(array[2*j+1].getIT().key()!=0){                        //有左子
        g.setColor(Color.black);
        g.drawLine(code[j].getX()+6,code[j].getY()+20,code[2*j+1].getX()+6,code[2*j+1].getY());
      }
      if(array[2*j+2].getIT().key()!=0){                        //有右子
        g.setColor(Color.black);
        g.drawLine(code[j].getX()+6,code[j].getY()+20,code[2*j+2].getX()+6,code[2*j+2].getY());
      }
    }
  }

//辅助方法:画箭头
  private void drawArrow(Graphics g, int x, int y){
      g.setColor(Color.red);
      g.drawLine(x,y,x,y-8);
      g.drawLine(x,y,x+2,y-2);
      g.drawLine(x,y,x-2,y-2);
      g.drawLine(x,y-1,x+1,y-1);
      g.drawLine(x,y-1,x-1,y-1);
  }
}

public class MyFrameMain{
  public static void main(String[]args){
    MyFrame mf=new MyFrame();
    mf.setVisible(true);
  }
}

⌨️ 快捷键说明

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