栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现Huffman哈夫曼树

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现Huffman哈夫曼树

代码如下:

package HuffmanTree;

import java.util.ArrayList;
import java.util.linkedList;
import java.util.Queue;
import java.util.Scanner;

public class HuffmanTree {
    private class TreeNode
    {
       private int val;
        private TreeNode left;
        private TreeNode right;

        public TreeNode()
        {
            val = 0;
            left = right = null;
        }

        public TreeNode(int e)
        {
            val = e;
            left = right = null;
        }
    }

    private TreeNode data[];
    private int size;

    private TreeNode TreeRoot;

    public HuffmanTree(int n)
    {
        TreeRoot = null;
        data = new TreeNode[n+1];
        Scanner sc = new Scanner(System.in);
        for (int i = 1;i<=n;i++)
        {
            TreeNode t = new TreeNode(sc.nextInt());
            data[i] = t;
            size++;
        }

        for (int i = size/2;i>0;i--)
        {
            percDown(i);
        }

    }

    private void percDown(int p)
    {
        TreeNode x = data[p];
        int parent,child;
        for (parent = p;parent*2 <=size;parent = child)
        {
            child = 2*parent;
            if (child!=size && data[child].val > data[child+1].val)
            {
                child++;
            }
            if (x.val <= data[child].val) break;
            else data[parent] = data[child];
        }
        data[parent] = x;
    }

    private TreeNode deleteMin()
    {
        TreeNode minData = data[1];
        TreeNode x = data[size--];
        int parent,child;
        for (parent = 1;parent*2<=size;parent = child)
        {
            child = 2*parent;
            if (child!=size && data[child].val > data[child+1].val)
            {
                child++;
            }
            if (x.val <= data[child].val) break;
            else data[parent] = data[child];
        }

        data[parent] = x;

        return minData;
    }

    private void insertHeap(TreeNode e)
    {
        int i = ++size;
        for (;i>1 && data[i/2].val > e.val ;i = i/2)
        {
            data[i] = data[i/2];
        }
        data[i] = e;
    }


    public void buildHuffmanTree()
    {
        TreeNode t;
        int cnt = size;
        for (int i = 1;i q = new linkedList<>();
        q.add(TreeRoot);
        while(!q.isEmpty())
        {
            TreeNode t = q.poll();
            printNode(t);
            if (t.left!=null) q.add(t.left);
            if (t.right!=null) q.add(t.right);
        }
    }

    public void codeHuffmanTree()
    {
        ArrayList arrays = new ArrayList<>();
        if (TreeRoot==null)
        {
            System.out.println(arrays);
            return ;
        }
        dfsNode(TreeRoot,arrays);

    }

    private void dfsNode(TreeNode root,ArrayList arrays)
    {
        if (root.left==null && root.right==null)
        {
            System.out.println(root.val+" = "+arrays);
            return ;
        }

        if (root.left!=null)
        {
            arrays.add(0);
            dfsNode(root.left,arrays);
            arrays.remove(arrays.lastIndexOf(0));
        }

        if (root.right!=null)
        {
            arrays.add(1);
            dfsNode(root.right,arrays);
            arrays.remove(arrays.lastIndexOf(1));
        }
    }

}

测试类如下:

package HuffmanTree;

public class TestHuffmanTree {
    public static void main(String[] args)
    {
        HuffmanTree hf = new HuffmanTree(7);
        hf.buildHuffmanTree();
        hf.levelOrder();
        hf.codeHuffmanTree();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/530944.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号