`
jcs130
  • 浏览: 131701 次
  • 性别: Icon_minigender_1
  • 来自: Ottawa
社区版块
存档分类
最新评论

我就是喜欢界面~~可视化打印哈弗曼树(二叉树)~JAVA实现

 
阅读更多

课程设计有一个哈夫曼编码解码的题,其他的一般要求还好说~就是最后面有一项用直观的方法输出哈夫曼树。

在网上搜了下,都是用凹凸表之类的在控制台输出,可是感觉还是不直观~

 

首先我按照遍历的方法,如果不是叶子节点,向左走,找左子树,并画直线,再找右子树,并画直线,一直到叶子节点把节点所代表的字符画上去。但是一开始我每一层画线的角度都是一样的,所以会出现重叠的情况,所以把每一层做一个标记,越向下走,X的值变化得越慢,Y值变化的越快,这样就不会出现重叠的问题了。

 

另外由于直接在窗体上划线在窗体重绘的时候线就会消失,所以就写了个窗体类继承了JFrame并重写了paint()方法,使每一次重绘的时候都能把我画的哈夫曼树画出来。

这是我画出来的哈夫曼树,层数不多,要是层数多的话再修改一下每层X和Y的变化值就可以了~


希望能对和我遇到同样问题的童鞋有所帮助~~哈~~

 

 

 

 

 

具体代码如下~

 

 

package 哈夫曼压缩;

import java.awt.Color;
import java.awt.Graphics;

/**
 * 形状抽象类,所有的形状都必须继承的类
 * @author Micro
 *
 */
public abstract class Shape {
	
	private Color c;//颜色
	
	
	public void setColor(Color c){
		this.c = c;
	}
	
	public Color getColor(){
		return c;
	}
	/**
	 * 绘制的方法
	 * @param g
	 */
	public abstract void draw(Graphics g);

}
 

 

package 哈夫曼压缩;

import java.awt.Graphics;
/**
 * 在界面上画一个字符
 * @author Micro
 *
 */
public class Word extends Shape {
	char c;
	int x;
	int y;

	public Word(char c, int x, int y) {
		this.c = c;
		this.x = x;
		this.y = y;
	}

	@Override
	public void draw(Graphics g) {
		// TODO Auto-generated method stub
		g.setColor(this.getColor());
		g.drawString("" + c, x-5, y+10);
	}

}
 

 

 

package 哈夫曼压缩;

import java.awt.Graphics;

/**
 * 直线类,继承Shape
 * 
 * @author Micro
 * 
 */
public class Line extends Shape {

	private int x1, y1, x2, y2;

	public Line(int x1, int y1, int x2, int y2) {
		this.x1 = x1;
		this.y1 = y1;
		this.x2 = x2;
		this.y2 = y2;
	}

	public void draw(Graphics g) {
		// /设置画布颜色
		g.setColor(this.getColor());
		g.drawLine(x1, y1, x2, y2);
	}

}
 

 

package 哈夫曼压缩;

import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JFrame;

/**
 * 重写了paint()方法的界面类
 * 
 * @author Micro
 * 
 */
public class MyWindow extends JFrame {

	// 储存所画的图形的列表
	ArrayList<Shape> shapes = new ArrayList<Shape>();

	public ArrayList<Shape> getShapes() {
		return shapes;
	}

	// 重写父类绘制窗体的方法
	public void paint(Graphics g) {
		super.paint(g);
		// 将队列中的形状取出来绘制
		for (int i = 0; i < shapes.size(); i++) {
			// 根据下标取出一个形状对象
			Shape sh = shapes.get(i);
			// 绘制
			sh.draw(g);
		}
	}

}
 

 

 

 

 

 

	// 打印哈夫曼树
	public void printTree(HafNode root) {
		MyWindow jf = new MyWindow();
		jf.setSize(800, 800);
		jf.setVisible(true);
		jf.setDefaultCloseOperation(3);
		drawTree(root, jf, 300, 150, 1);
	}

	// 画哈夫曼树
	public void drawTree(HafNode a, MyWindow jf, int x, int y, int level) {
		Graphics g = jf.getGraphics();
		level++;
		if (a.getLeft() == null && a.getRight() == null) {
			g.drawString("" + a.getN(), x, y);
			jf.getShapes().add(new Word(a.getN(), x, y));
			System.out.println("画完节点" + a.getN());
		}
		if (a.getLeft() != null) {
			g.drawLine(x, y, x - 150/level, y + 10*level);
			jf.getShapes().add(new Line(x, y, x - 150/level, y + 10*level));
			drawTree(a.getLeft(), jf, x - 150/level, y + 10*level, level);
		}
		if (a.getRight() != null) {
			g.drawLine(x, y, x + 150/level, y + 10*level);
			jf.getShapes().add(new Line(x, y, x + 150/level, y + 10*level));
			drawTree(a.getRight(), jf, x + 150/level, y + 10*level, level);
		}
	}
  • 大小: 16.6 KB
1
3
分享到:
评论
2 楼 jcs130 2012-07-10  
ffdqlff 写道
不错.也可以遍历一次,把x,y求出来,然后所有线条都是用这个x,y,会美观一点,不过会比较麻烦

那个……表示没有看懂……您是说先把xy存起来再一起画么?
1 楼 ffdqlff 2012-07-09  
不错.也可以遍历一次,把x,y求出来,然后所有线条都是用这个x,y,会美观一点,不过会比较麻烦

相关推荐

    java语言哈弗曼树的全部代码实现

    设计一个可视化窗体,实现文本内容与其编码信息的互译,基本要求为:一个区域中输入文本信息,按照哈夫曼编码机制,在另一个区域中输出相应的哈夫曼编码信息,同时在第三个区域中显示对编码信息的反编译结果。...

    哈弗曼树及编码 C语言实现

    在C语言下实现哈弗曼树的创建并进行哈弗曼编码,同时输出哈弗曼编码。

    基于哈弗曼编码的二叉树编码的mfc实现

    在项目"最优二叉树(已完成)"中,很可能包含了实现这些功能的源代码文件,包括哈弗曼树的构建、编码和解码算法的实现,以及MFC界面的交互逻辑。通过阅读和分析这些代码,我们可以更深入地理解哈弗曼编码的工作原理...

    图形化输出哈弗曼树-数据结构

    为了可视化展示哈弗曼树,代码实现了`DFS`深度优先搜索算法,通过递归方式遍历哈弗曼树,并记录每个节点的位置信息(深度),从而实现图形化的输出。 ```cpp void DFS(int u, int deep) { huf[u].deep = deep; int...

    MFC 哈弗曼树

    在MFC(Microsoft Foundation Classes)框架下,我们可以利用其丰富的用户界面组件来实现一个可视化操作的哈弗曼编码程序。 首先,我们需要理解哈弗曼编码的基本原理。哈弗曼编码是一种前缀编码方法,即任意两个...

    关于哈弗曼树的一个算法

    1.jpg、2.jpg和3.jpg可能包含的是哈弗曼树的可视化示例,帮助理解哈弗曼树的构造结果或者编码过程。 使用哈弗曼树的主要优点在于: - **压缩效率高**:对于具有不同频率的字符,哈弗曼编码可以实现较高的压缩率,...

    哈弗曼树的建立 C++代码

    4. **菜单功能**:`menu5()`函数提供了一个简单的文本界面,允许用户选择初始化或输出哈弗曼树结构。此功能增加了程序的交互性,便于调试和理解哈弗曼树的构建过程。 5. **主函数逻辑**:`main()`函数作为程序入口...

    树 哈弗曼算法。二叉树遍历的应用。矩阵的相乘

    无论是对于二叉搜索树的元素查找,还是对于二叉树的结构化打印,二叉树遍历都是不可或缺的操作。 最后,我们探讨矩阵乘法,它是线性代数中的一个基本操作,对于解决工程和科研中的许多问题至关重要。在C语言中,...

    双向链表,二叉树,哈弗曼树的构建

    哈弗曼树是一种特殊的二叉树,用于数据压缩,通过对出现频率高的字符赋予较短的编码,实现高效的编码和解码。哈弗曼树的构建过程包括两个步骤:一是创建哈弗曼节点,根据字符出现频率构造权值;二是通过合并最小的两...

    数据结构之哈弗曼树实现压缩

    哈弗曼树(Huffman Tree),也称为最优二叉树,是数据结构中的一种特殊树形结构,主要用于数据编码和解码,特别是用于数据压缩。它通过构建一棵权值最小的二叉树来达到最高效的编码效果。在哈弗曼树中,频率较高的...

    哈弗曼树C++源代码

    哈弗曼树(Huffman Tree),也称为最优二叉树,是一种特殊的二叉树,用于数据编码和解码,尤其在数据压缩领域有着广泛应用。它是由哈弗曼在1952年提出的一种构建方法,旨在最小化带权路径长度(WPL),即树中所有...

    用C语言实现哈弗曼树(数据结构课程设计)

    哈弗曼树,又称最优二叉树或最小带权路径长度树,是一种特殊的二叉树,广泛应用于数据压缩、文件编码等领域。在数据结构课程设计中,使用C语言实现哈弗曼树是一个经典且富有挑战性的任务。下面将详细介绍如何用C语言...

    指针实现哈弗曼树

    哈弗曼树(Huffman Tree),也称为最优二叉树,是一种特殊的二叉树结构,广泛应用于数据压缩中。在哈弗曼树中,每个叶子节点代表一个需要编码的字符,而权重通常表示该字符在文本中的出现频率。构建哈弗曼树的过程是...

    哈弗曼树进行压缩编码

    哈弗曼树(Huffman Tree),也称为最优二叉树,是一种特殊的二叉树结构,广泛应用于数据压缩领域。在信息编码中,哈弗曼编码是一种可变长度的前缀编码方式,它根据字符出现频率构建哈弗曼树,使得出现频率高的字符...

    利用哈弗曼树实现编码译码

    哈弗曼编码是一种高效的数据压缩方法,它基于一种特殊的二叉树——哈弗曼树(Huffman Tree),也称为最优二叉树。在MFC(Microsoft Foundation Classes)框架下,我们可以构建用户界面来实现哈弗曼编码和解码的过程...

    哈弗曼树的建立及哈弗曼编码的生成 c++实现

    哈弗曼树(Huffman Tree),也称为最优二叉树,是数据结构中的一种特殊二叉树,主要用于数据的编码和解码,特别是在文本压缩中起到关键作用。它通过一种贪心策略构建,使得带权路径长度最短,从而达到编码效率最高。...

    完全二叉树,哈弗曼树应用觉对经典

    完全二叉树与哈弗曼树是数据结构领域中的两种重要树形结构,它们在计算机科学中有着广泛的应用。在本篇文章中,我们将深入探讨这两种数据结构及其在实际问题中的应用。 首先,让我们来理解完全二叉树的概念。完全...

    C++实现哈弗曼树的建立

    ### C++ 实现哈夫曼树的建立 #### 概述 哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树,在数据压缩编码、文件系统等方面有着广泛的应用。本文将详细介绍如何利用 C++ 来实现哈夫曼树...

    哈弗曼树的生成(编码)

    哈弗曼树,又称霍夫曼树,是一种特殊的二叉树,主要用于数据的高效编码,尤其是在数据压缩领域有着广泛的应用。这种树结构的特点是:树中任一节点的两个子节点都是子树中权值最小的两个节点。权值在这里通常代表字符...

    哈弗曼树的代码

    哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树

Global site tag (gtag.js) - Google Analytics