java代码创建HuffmanTree

3 篇文章 0 订阅
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

/**
 * 创建HuffmanTree
 * 
 * @author LYYL
 *
 */
public class HuffmanTree {
	private static class Node
   
   
    
    {
		E data;
		double weight;
		Node leftChild;
		Node rightChild;
		public Node(E data, double weight){
			this.data = data;
			this.weight = weight;
		}
		public String toString(){
			return "Node[data="+data+", weight" + weight + "]";
		}
	}
	private Node createTree(List
    
    
     
      nodes){
		while(nodes.size() > 1){
			quickSort(nodes);
			Node left = nodes.get(nodes.size()-1);
			Node right = nodes.get(nodes.size()-2);
			Node parent = new Node(null, left.weight+right.weight);
			parent.leftChild = left;
			parent.rightChild = right;
			nodes.remove(nodes.size()-1);
			nodes.remove(nodes.size()-1);
			nodes.add(parent);
		}
		return nodes.get(0);
	}
	//将指定数组的i和j索引处的元素交换
	private void swap(List
     
     
      
       nodes, int i, int j){
		Node temp;
		temp = nodes.get(i);
		nodes.set(i, nodes.get(j));
		nodes.set(j, temp);
	}
	//用快速排序法实现对节点进行排序
	private void subSort(List
      
      
       
        nodes, int start, int end){
		if(start < end){
			//以第一个元素最为分界值
			Node base = nodes.get(start);
			//i从左边搜索,搜索大于分界值的元素索引
			int i = start;
			//j从右边搜索,搜索小于分界值的索引
			int j = end + 1;
			while(true){
				while(i < end && nodes.get(++i).weight >= base.weight);
				while(j > start && nodes.get(--j).weight <=base.weight);
				if(i < j){
					swap(nodes, i, j);
				}else{
					break;
				}
			}
			swap(nodes, start, j);
			subSort(nodes, start, j-1);
			subSort(nodes, j+1, end);
		}
	}
	//快速排序节点
	private void quickSort(List
       
       
         nodes){ subSort(nodes, 0, nodes.size()-1); } //广度优先遍历 private List 
        
          breadthFirst(Node root){ Queue 
         
           queue = new ArrayDeque 
          
            (); List 
           
             list = new ArrayList 
            
              (); if(root != null){ queue.offer(root); } while(!queue.isEmpty()){ list.add(queue.peek()); Node p = queue.poll(); System.out.println(p.leftChild); if(p.leftChild != null){ queue.offer(p.leftChild); } if(p.rightChild != null){ queue.offer(p.rightChild); } } return list; } public static void main(String[] args) { List 
             
               nodes = new ArrayList 
              
                (); nodes.add(new Node("A", 40.0)); nodes.add(new Node("B", 8.0)); nodes.add(new Node("C", 10.0)); nodes.add(new Node("D", 30.0)); nodes.add(new Node("E", 10.0)); nodes.add(new Node("F", 20.0)); nodes.add(new Node("G", 3.0)); HuffmanTree huffmanTree = new HuffmanTree(); Node root = huffmanTree.createTree(nodes); System.out.println(huffmanTree.breadthFirst(root)); } } 
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   
创建HuffmanTree中的关键思想:
1、对List集合中所有节点进行排序
2、找出List集合中权值最小的两个节点
3、以权值最小的两个节点作为子节点创建新节点
4、从List集合中删除权值最小的最小的两个节点,将新节点添加到List集合中
程序采用循环不断地执行上面1、2、3、4步,直到List集合中只剩下一个节点,最后剩下的这个节点就是哈夫曼树的根节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值