📄 myframemain.java
字号:
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 + -