标签:compareto 数列 code 最小 create tps array 表示 最优
给你一个数列{13, 7, 8, 3, 29, 6, 1},要求转成一棵赫夫曼树.
public class HuffumanTree {
public static void main(String[] args) {
int[] arr = {13, 7, 8, 3, 29, 6, 1};
HuffumanNode root = createHuffumanTree(arr);
//进行前序遍历,检测是否构建成功
preOrder(root);
}
//前序遍历
public static void preOrder(HuffumanNode root){
if (root == null){
System.out.println("赫夫曼树为空");
}else {
root.preOrder();
}
}
//构建赫夫曼树
private static HuffumanNode createHuffumanTree(int[] arr) {
//1.遍历arr,将其放入list中,方便排序
List<HuffumanNode> nodes = new ArrayList<>();
for (int item:arr) {
nodes.add(new HuffumanNode(item));
}
//集合中只有一个元素时,就表示赫夫曼树构建成功了,这个元素就是根节点
while (nodes.size()>1){
//排序
Collections.sort(nodes);
//取出集合前两个元素,即最小的两个元素
HuffumanNode leftNode = nodes.get(0);
HuffumanNode rightNode = nodes.get(1);
//构成树
HuffumanNode parent = new HuffumanNode(leftNode.val + rightNode.val);
parent.left = leftNode;
parent.right = rightNode;
//从列表中删除取出的元素,并将paret添加到集合中
nodes.remove(leftNode);
nodes.remove(rightNode);
nodes.add(parent);
}
return nodes.get(0);
}
}
//因为需要进行排序,所以实现 Comparable 接口
class HuffumanNode implements Comparable<HuffumanNode>{
int val; //值
HuffumanNode left; //左节点
HuffumanNode right; //右节点
public HuffumanNode(int val) {
this.val = val;
}
@Override
public String toString() {
return "HuffumanNode{" +
"val=" + val +
‘}‘;
}
@Override
public int compareTo(HuffumanNode o) {
//从小到大
return this.val-o.val;
}
//前序遍历
public void preOrder(){
System.out.println(this);
if (this.left!=null){
this.left.preOrder();
}
if (this.right!=null){
this.right.preOrder();
}
}
}
标签:compareto 数列 code 最小 create tps array 表示 最优
原文地址:https://www.cnblogs.com/liuzhidao/p/13886274.html