哈弗曼树的绘制

时间:2022-09-29 22:03:08

开始时,没有重写paint方法,使得绘制树的时候,背景总是eclipse的界面。
后来改用重写paint方法绘制,但是同样面临着许多问题。我选择在使用递归给各个字符编码的时候绘制哈弗曼树,这样就要给paint方法传入各种参数,但是我发现每当给paint方法传入除graphics g以外的参数时,paint方法就不会在tree.setVisible(true); 这行代码运行时执行了。
我想paint方法是不是只能有一个参数graphics g

后来保证重写paint时只写入一个参数graphics g,将绘制树之前的一系列准备工作都放入paint中,才顺利完成了树的绘制。

    public void paint(Graphics g){
super.paint(g);
String str = "qwertyuiop";
String codeStr="";
int array[] = traversStr(str);//遍历数组,找出各个字符出现的次数

MyArrayList<Node> ml = new MyArrayList();
packageFun(ml,array);//封装成节点

Node node = Hfm(ml);//创建哈弗曼二叉树
int length = 0;
int code[] = new int[30];
traversal(node,code,length, g,300,150);
//Cout(arrayStr);
codeStr = encoded(str);
decoding(codeStr);

}

这里面的调用的traversal()方法就是具体绘制树的方法
给它传入
node : 根节点
code[] : 空的数组,用来存放各个字符的编码结果
length : 字符编码的长度
g : 画板
绘制的起点坐标:300,150(也就是说,我们是从根节点往下绘制的)

下面是traversal()方法的代码:

// 遍历数组的方法
public void traversal(Node node,int code[],int length,Graphics g,int x,int y){//返回码表

if(node==null){
return;
}else{
if(node.getLeft()==null && node.getRight()==null){
System.out.print(node.getData().getC()+" : ");
int num = (int) node.getData().getC().charAt(0);
arrayStr[num]="";
for(int i=0;i<length;i++){
System.out.print(code[i]);
arrayStr[num]=arrayStr[num]+code[i];//写码表
}System.out.println();
}

g.drawString(node.getData().getC(), x,y);
g.drawString(node.getData().getF()+"", x+20, y);
code[length] = 0;

traversal(node.getLeft(),code,length+1,g,x-50,y+50);
if(node.getLeft()!=null)
g.drawLine(x, y,x-50,y+50);

g.drawString(node.getData().getC(), x,y);
g.drawString(node.getData().getF()+"", x+20, y);
code[length] = 1;


traversal(node.getRight(),code,length+1,g,x+50,y+50);
if(node.getRight()!=null)
g.drawLine(x, y,x+50,y+50);


}
}

这里其实还存在着问题,比如:当字符比较多的时候,绘制哈弗曼树时子节点之间会相互重叠。