哈夫曼树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 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40709110/article/details/102688604