📄 myframemain.java
字号:
/*
本程序用于演示检索二叉树的主要操作,结果通过图的形式显示在窗口的下部
*/
//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 + -