美文网首页
当Kotlin遇见数据结构丨哈夫曼树的实现

当Kotlin遇见数据结构丨哈夫曼树的实现

作者: MobMsg | 来源:发表于2019-02-22 18:58 被阅读14次

哈夫曼树定义

给定N个数值作为N个叶子结点的权值,构造一颗二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也叫哈夫曼树。

哈夫曼树是带权路径长度最小的树,权值越大的节点距离根节点越近。

带权路径:根结点到第L层结点路径的长度,长度为 L-1。
树的带权路径长度:树的所有叶子节点带权路径总和,简称 WPL(Weighted Path Length of Tree)。


Kotlin 中哈夫曼树如何实现

1. 实现的流程

1.1 将数组中所有元素创建为若干二叉树
1.2 排序
1.3 取出最小权值的两个二叉树 并 创建新的二叉树
1.4 把两个最小权值的子树从集合中移除 并 将新二叉树放入集合
1.5 循环处理 1.2 - 1.4,直到集合的 size = 1 时停止

2. 实现的代码

    /**
     * 将数组转换为赫夫曼树
     * */
    fun createHuffmanTree(arr:IntArray):Node{

        // 将数组中所有元素创建为若干二叉树
        var nodeList:ArrayList<Node> = arrayListOf()
        for(value:Int in arr) {
            nodeList.add(Node(value = value))
        }

        // 循环处理
        while (nodeList.size > 1){

            // 排序
            Collections.sort(nodeList)

            // 取出最小权值的两个二叉树 并 创建新的二叉树
            var leftNode:Node = nodeList.get(nodeList.size-1)
            var righeNode:Node = nodeList.get(nodeList.size-2)
            var parentNode:Node = Node(value = (leftNode.value!! + righeNode.value!!), leftNode = leftNode, rightNode = righeNode)

            // 把两个子树从集合中移除 并 将新二叉树放入集合
            nodeList.remove(leftNode)
            nodeList.remove(righeNode)
            nodeList.add(parentNode)
        }

        // 经过不断处理,最终其实只剩一个 Node 对象,也就是根节点
        return nodeList.get(0)
    }

3. 赋值调用转换方法

// 定义任意数组
var arr:IntArray = intArrayOf(3,7,8,29,5,11,23,14)

// 转换数组 并 获取哈夫曼树的根节点
var node:Node = createHuffmanTree(arr)

Log.e("==", "根节点权值 = ${node.value}")


运行结果


国际惯例

贴上完整源码


/**
 * @des 哈夫曼树
 * @author liyongli 20190222
 * */
class HuffmanTreeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_huffman_tree)

        // 定义任意数组
        var arr:IntArray = intArrayOf(3,7,8,29,5,11,23,14)

        // 转换数组 并 获取哈夫曼树的根节点
        var node:Node = createHuffmanTree(arr)

        Log.e("", "=============================")
        Log.e("", "根节点权值为: ${node.value}")
        Log.e("", "=============================")

    }

    /**
     * 将数组转换为赫夫曼树
     * */
    fun createHuffmanTree(arr:IntArray):Node{

        // 将数组中所有元素创建为若干二叉树
        var nodeList:ArrayList<Node> = arrayListOf()
        for(value:Int in arr) {
            nodeList.add(Node(value = value))
        }

        // 循环处理
        while (nodeList.size > 1){

            // 排序
            Collections.sort(nodeList)

            // 取出最小权值的两个二叉树 并 创建新的二叉树
            var leftNode:Node = nodeList.get(nodeList.size-1)
            var righeNode:Node = nodeList.get(nodeList.size-2)
            var parentNode:Node = Node(value = (leftNode.value!! + righeNode.value!!), leftNode = leftNode, rightNode = righeNode)

            // 把两个子树从集合中移除 并 将新二叉树放入集合
            nodeList.remove(leftNode)
            nodeList.remove(righeNode)
            nodeList.add(parentNode)
        }

        // 经过不断处理,最终其实只剩一个 Node 对象,也就是根节点
        return nodeList.get(0)

    }

}


本篇到此完结,更多Kotlin与数据结构原创内容持续更新中~

期待您点击关注或点击头像浏览更多移动端开发技术干货

相关文章

  • 当Kotlin遇见数据结构丨哈夫曼树的实现

    哈夫曼树定义 给定N个数值作为N个叶子结点的权值,构造一颗二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最...

  • 哈夫曼树(代码实现)

    前面我们介绍了哈夫曼树的理论实现,现在介绍一下具体代码实现。 我们先定义哈夫曼树节点的数据结构。 在有了树节点之后...

  • 哈夫曼编码

    实验目的: (1) 掌握二叉树的定义; (2) 掌握哈夫曼树和哈夫曼编码算法的实现。 实验内容: 实现一个哈夫曼编...

  • 当Kotlin遇见数据结构丨哈夫曼编码

    哈夫曼编码定义 哈夫曼编码是一种编码格式,属于可变字长编码的一种,该方法依照字符出现的概率来构建异字头的平均长度最...

  • 当Kotlin遇见数据结构丨哈夫曼解码

    哈夫曼编码定义 哈夫曼编码是一种编码格式,属于可变字长编码的一种,该方法依照字符出现的概率来构建异字头的平均长度最...

  • 哈夫曼树

    数据结构——哈夫曼树 哈夫曼树又被称为最优二叉树,是指一类带权路径长度最小的二叉树,哈夫曼树的遍历不是唯一的,因为...

  • 数据结构06-哈夫曼树与哈夫曼编码

    数据结构06-哈夫曼树 一、哈夫曼树的基本概念 1.哈夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若带权...

  • 《恋上数据结构与算法一》笔记(十八)哈夫曼树

    目录 哈夫曼编码(Huffman Coding) 哈夫曼树 构建哈夫曼树 构建哈夫曼编码 一 哈夫曼编码(Huff...

  • 《数据结构与算法》总结(七)哈夫曼树

    目录 哈夫曼编码(Huffman Coding) 哈夫曼树 构建哈夫曼树 构建哈夫曼编码 一 哈夫曼编码(Huff...

  • 2018-11-27

    专业英语 第九章 数据结构 根据哈夫曼树求哈夫曼编码以及图的基本定义

网友评论

      本文标题:当Kotlin遇见数据结构丨哈夫曼树的实现

      本文链接:https://www.haomeiwen.com/subject/qqisyqtx.html