ハフマン木Javaコードの実装

ハフマン木?
ハフマンツリーはまた、最適なバイナリツリーとして知られている最短経路長重み付け二分木です。図を参照するものと説明します。
ここに画像を挿入説明
ここに画像を挿入説明

package com.sun.hafumanTree;

import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class hafumantree {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int arr[]={13,7,8,3,29,6,1};
		Node root=create(arr);
		preOrder(root);
	
	}
	public static void preOrder(Node root){
		if(root !=null){
			root.preOrder();
		}
	}
	//创建哈夫曼树
	public static Node create(int[] arr){
		
		//1.遍历数组
		//2.数组元素构成node
		//3.将node放入ArrayList
		List<Node> nodes=new ArrayList<Node>();
		for (int value : arr) {
			Node node=new Node(value);
			nodes.add(node);
		}
		while(nodes.size()>1){
		//排序从小到大
		Collections.sort(nodes);
		
		//取出根节点权值最小的二叉树
		Node leftnode=nodes.get(0);
		
		//取出根节点权值第二小的二叉树
		Node rightnode=nodes.get(1);
		
		///构建新的二叉树
		Node parent=new Node(leftnode.value+rightnode.value);
		
		parent.left=leftnode;
		parent.right=rightnode;
		
		//删除掉用过的节点
		nodes.remove(leftnode);
		nodes.remove(rightnode);
		
		//将新构建的parent加入到nodes
		nodes.add(parent);
		}
		return nodes.get(0);
		
	}  
//创建节点
//让节点实现Comparable接口
	static class Node implements Comparable<Node>{
		int value;//节点权值
		Node left;//指向左子节点
		Node right;//指向右子节点
		public Node(int value) {
			
			this.value = value;
		}
		@Override
		public String toString() {
			return "Node [value=" + value + ", left=" + left + ", right="
					+ right + "]";
		}
		@Override
		public int compareTo(Node o) {
		// TODO Auto-generated method stub
		//表示从小到大排序
		return this.value - o.value;
		
		}
		//前序遍历
		public void preOrder(){
			System.out.println(this);
			if(this.left != null){
				this.left.preOrder();
			}
			if(this.right != null){
				this.right.preOrder();
			}	
		}
	}
}

公開された58元の記事 ウォン称賛20 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_40709110/article/details/102688604