• 哈夫曼树


    package Hafuman;
    
    import java.util.ArrayList;
    import java.util.List;
    //哈夫曼树原理
    //http://blog.csdn.net/shuangde800/article/details/7341289
    
    public class TreeNode {
        int id;
        String nodeVaule;
        double weight;
        TreeNode leftNode;
        TreeNode rightNode;
        TreeNode parentNode;
        
        
        
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getNodeVaule() {
            return nodeVaule;
        }
        public void setNodeVaule(String nodeVaule) {
            this.nodeVaule = nodeVaule;
        }
        public double getWeight() {
            return weight;
        }
        public void setWeight(double weight) {
            this.weight = weight;
        }
        
        public TreeNode getLeftNode() {
            return leftNode;
        }
        public void setLeftNode(TreeNode leftNode) {
            this.leftNode = leftNode;
        }
        public TreeNode getRightNode() {
            return rightNode;
        }
        public void setRightNode(TreeNode rightNode) {
            this.rightNode = rightNode;
        }
        public TreeNode getParentNode() {
            return parentNode;
        }
        public void setParentNode(TreeNode parentNode) {
            this.parentNode = parentNode;
        }
        public static int getSelfId() {
            return selfId;
        }
        public static void setSelfId(int selfId) {
            TreeNode.selfId = selfId;
        }
        static int selfId = 0;
        //建立一个哈夫曼树
        public TreeNode creatTree(List<List<String>>dataList){
            //创建一个森林
            List<TreeNode> dataNodes = new ArrayList();
            for(int i = 0;i<dataList.size();i++){
                List temp = dataList.get(i);
                TreeNode tempNode = new TreeNode();
                
                tempNode.setId(++selfId);
                tempNode.setNodeVaule((String) temp.get(0));
                tempNode.setWeight(Double.valueOf((String) temp.get(1)));
                tempNode.setLeftNode(new TreeNode());
                tempNode.setRightNode(new TreeNode());
                dataNodes.add(tempNode);
            }
            //for(int i = 0;i<3;i++){
            while(dataNodes.size()>1){
                dataNodes=creatNew(dataNodes);
            }
            TreeNode tree = dataNodes.get(0);
            return tree;
        }
        public List<TreeNode> creatNew(List<TreeNode> dataNodes){
            int FirstIndex = selectmin(dataNodes);
            TreeNode First = dataNodes.get(FirstIndex);
            dataNodes.remove(FirstIndex);
            int SecondIndex = selectmin(dataNodes);
            TreeNode Second = dataNodes.get(SecondIndex);
            dataNodes.remove(SecondIndex);
            TreeNode newNode = new TreeNode();
            newNode.setLeftNode(First);
            newNode.setRightNode(Second);
            First.setParentNode(newNode);
            Second.setParentNode(newNode);
            newNode.setWeight(First.getWeight()+Second.getWeight());
            newNode.setId(++selfId);
            dataNodes.add(newNode);
            return dataNodes;
        }
        private int selectmin(List<TreeNode> dataNodes) {
            double min = dataNodes.get(0).getWeight();
            int minIndex = 0;
            for(int i = 1;i<dataNodes.size();i++){
                if(min>dataNodes.get(i).getWeight()){
                    min = dataNodes.get(i).getWeight();
                    minIndex = i;
                }
            }
            return minIndex;
        }
        
        
        //哈夫曼编码
        public void traverse(){
            if(this.getNodeVaule()!=null){
                List codethis = Code(this);
                System.out.print(this.getNodeVaule()+":  ");
                for(int i = 0;i<codethis.size();i++){
                    
                    System.out.print(codethis.get(codethis.size()-i-1));
                }
                System.out.println();
            }
            if(this.getRightNode()==null){
                return;
            }else{
                this.getRightNode().traverse();
            }
            if(this.getLeftNode()==null){
                return;
            }else{
                this.getLeftNode().traverse();
            }
        }
        
        //对于一个确定有值得node的编码
        public List Code(TreeNode node){
            List codeList = new ArrayList();
            if(node.getParentNode()!=null){
                TreeNode parent = node.getParentNode();
                if(parent.getLeftNode().getId()==node.getId()){
                    codeList.add(0);
                    codeList.addAll(Code(parent));
                    return codeList;
                }else{
                    codeList.add(1);
                    codeList.addAll(Code(parent));
                    return codeList;
                }
            }else{
                return codeList;
            }
    }
    }




    package Hafuman;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class testClass {
    
        public static void main(String[] args) {
            String [][]data ={{"a","1"},{"b","5"},{"c","10"},{"d","8"},{"u","3"},{"p","11"}};
            List<List<String>>dataList = new ArrayList();
            for(int i = 0;i<data.length;i++){
                List temp = new ArrayList();
                for(int j = 0;j<data[i].length;j++){
                    temp.add(data[i][j]);
                }
                dataList.add(temp);
            }
            TreeNode t = new TreeNode();
            t=t.creatTree(dataList);
            t.traverse();
        }
    
    }
    
    
    
     
  • 相关阅读:
    Fragment_3_Androidx中返回键的处理
    2.2.3.Architecture components_View Binding
    2.2.2.Architecture components_data binding2_源码分析
    经典排序
    动态规划求解最长公共子序列
    全排列问题
    钢条切割
    KMP
    Queue
    Stack
  • 原文地址:https://www.cnblogs.com/yunerlalala/p/6129828.html
Copyright © 2020-2023  润新知