编程语言
首页 > 编程语言> > java学习笔记——赫夫曼树(最优二叉树)

java学习笔记——赫夫曼树(最优二叉树)

作者:互联网

目录

赫夫曼树的定义

与赫夫曼树相关的几个重要概念

构成赫夫曼树的步骤

代码实现

public class Node implements Comparable<Node>{
    public int val;
    public Node left;
    public Node right;

    public Node(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "Node{" +
                "val=" + val +
                '}';
    }

    @Override
    public int compareTo(Node o) {
        return this.val - o.val;    //this-o为从小到大排序,反过来为从大到小
    }
}
public class HuffmanTree {
    public Node root;
    public int[] arr;

    public HuffmanTree(int[] arr) {
        this.arr = arr;
        this.root = creatHuffmanTree(arr);
    }
	
	//构建赫夫曼树
    public Node creatHuffmanTree(int[] arr){
        if (arr.length == 0){
            return null;
        }
        if (arr.length < 2){
            return new Node(arr[0]);
        }

        //将数组中的元素都转换成节点,并添加到list中
        List<Node> list = new ArrayList<>();
        for (int i : arr) {
            list.add(new Node(i));
        }
        Collections.sort(list); //对list排序

        //循环最后list中只会有一个元素,即赫夫曼树的根节点
        while (list.size()>1){
            //将数组中权值最小的两个节点构成新的二叉树,该树的权为那两个节点的权值之和
            Node sub_root = new Node(list.get(0).val + list.get(1).val);
            sub_root.left = list.get(0);
            sub_root.right = list.get(1);

            //将拿出的两个节点从list中去除,并将新二叉树的根节点添加进去,然后排序
            //这里注意一定要先remove索引为 1 的元素,如果后remove它,那么在最后list中只剩2个元素的时候,先remove了索引为 1 的元素,此时list中就只剩一个元素了,此时如果list.remove(1)会产生索引越界异常
            list.remove(1);
            list.remove(0);
            list.add(sub_root);
            Collections.sort(list);
        }

        return list.get(0);
    }

	//前序遍历
    public void preList(Node root){
        if (root == null){
            System.out.println("二叉树为空!!");
            return;
        }

        System.out.println(root);

        if (root.left != null){
            preList(root.left);
        }
        if (root.right != null){
            preList(root.right);
        }
    }
}

标签:Node,java,list,public,二叉树,节点,夫曼
来源: https://blog.csdn.net/qq_36334929/article/details/114751483