一、运行结果
Node(data=null, weight=73)
left:Node(data=null, weight=33)
left:Node(data=null, weight=16)
left:Node(data=a, weight=8)
right:Node(data=null, weight=8)
left:Node(data=g, weight=1)
right:Node(data=c, weight=7)
right:Node(data=f, weight=17)
right:Node(data=null, weight=40)
left:Node(data=e, weight=19)
right:Node(data=null, weight=21)
left:Node(data=b, weight=10)
right:Node(data=d, weight=11)
二、源代码
import kotlin.collections.ArrayList
class HuffmanTree {
class Node<T>(var data: T?, var weight: Int) : Comparable<Node<T>> {
var leftNode: Node<T>? = null
var rightNode: Node<T>? = null
override fun compareTo(other: Node<T>): Int {
return this.weight - other.weight
}
override fun toString(): String {
return "Node(data=$data, weight=$weight)"
}
}
fun <T> createHuffmanTree(nodes: ArrayList<Node<T>>): Node<T>? {
while (nodes.size > 1) {
nodes.sort()
val leftNode = nodes[0]
val rightNode = nodes[1]
var parentNode = Node<T>(null, leftNode.weight + rightNode.weight)
parentNode.leftNode = leftNode
parentNode.rightNode = rightNode
nodes.removeAt(0)
nodes.removeAt(0)
nodes.add(parentNode)
}
return if (nodes.isEmpty()) null else nodes[0]
}
fun <T> printTree(node: Node<T>?) {
println(node)
if (node?.leftNode != null) {
print("left:")
printTree(node.leftNode)
}
if (node?.rightNode != null) {
print("right:")
printTree(node.rightNode)
}
}
}
fun main() {
var huffmanTree = HuffmanTree()
var nodes = arrayListOf<HuffmanTree.Node<String>>()
nodes.add(HuffmanTree.Node("a", 8))
nodes.add(HuffmanTree.Node("b", 10))
nodes.add(HuffmanTree.Node("c", 7))
nodes.add(HuffmanTree.Node("d", 11))
nodes.add(HuffmanTree.Node("e", 19))
nodes.add(HuffmanTree.Node("f", 17))
nodes.add(HuffmanTree.Node("g", 1))
val tree = huffmanTree.createHuffmanTree(nodes)
huffmanTree.printTree(tree)
}