Java数据结构之《构造哈夫曼树》(难度系数85)

一、前言:

  这是怀化学院的:Java数据结构中的一道难度中等(偏难理解)的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完,并成功实现,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。(这一个题书上也有现成类似的代码,重要的是理解它的算法原理!)

二、题目要求如下:

(第 16 题)构造哈夫曼树(难度系数85+%5)(自己添加的%5哈哈)

构造哈夫曼树
题目描述:
根据给定的叶结点字符及其对应的权值创建哈夫曼树。
输入:
第一行为叶子结点的数目n(1<=n<=100)。第二行为一个字符串,包含n个字符,每个字符对应一个叶子结点,第三行为每个叶子结点的概率(即权值),要求根据各叶结点构造哈夫曼树。构造哈夫曼树的原则是先两个最小的,构造一个父结点,其中最小的结点为左孩子,次小的为右孩子,如果两个最小的叶结点相等,则取排在前一个位置的为左孩子。
输出:
哈夫曼树的权值,左孩子,右孩子及其对应的父亲,相邻数据之间用空格隔开;
输入样例:
5
abcde
15 25 15 20 25
输出样例:
15 0 0 6
25 0 0 7
15 0 0 6
20 0 0 7
25 0 0 8
30 1 3 8
45 4 2 9
55 5 6 9
100 7 8 0

补充:题目意思一定要深度揣摩一下,没有提示就得自己根据它题目给的输入输出来推一下原理了,不然就是盲目下手出错很多!

三、代码实现: (代码的做题原理全部在代码注释中,若还有疑问也可以翻书关于哈夫曼树的构造原理的内容) 

补充:应该当你放到考试系统里检测代码是否正确时,请把所有的代码注释去掉哦!不过是自己的编译器应该没问题的

(1)我把所有的实现细节全部放到一个类里了:(解释已经尽力详细了...)

package com.fs.demo;
import java.util.Scanner;
public class HuffmanTree {
    //构建结点静态内部类
    private static class Node{
        private int data;  //当前哈夫曼树的总值
        //题目中要求输出的左孩子和右孩子结点都是用数字表示,父结点也是一样
        private int lchild;  //左孩子
        private int rchild;  //右孩子
        private int parent;  //父结点
        //默认初始化;没有左孩子、右孩子以及父结点默认数值为0
        public Node(){
            this.data=0;
            this.lchild=0;
            this.rchild=0;
            this.parent=0;
        }
    }

    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();  //代表最先给的叶子结点的个数
        String node01 = sc.next();   //代表n个叶子结点组成的字符串
        // 之所以把存储每个结点的数组长度设为(2*n-1),
        // 是因为在非空二叉树中,拥有2个度的结点=叶子结点个数-1,则整个构造成功的哈夫曼树的结点总数=n*n-1=2*n-1
        Node [] node = new Node[2*n-1];
        for(int i=0;i

 四、代码测试运行结果:

<1>题目的输入样例测试情况:

Java数据结构之《构造哈夫曼树》(难度系数85)_第1张图片

你可能感兴趣的:(Java数据结构实训,数据结构,哈夫曼树,算法,java)