标签:return The span null ret node 路径 创建 最小
按照定义;假设右n个权值{w1,w2,...wn},构造一颗带有n个叶子节点的二叉树,每一个叶子节点权值为wk,每个叶子节点的路径长度为lk,其中带权路径长度WPL = w1*l1+w2*l2+w3*l3+...wn*ln,如果该WPL最小则称该二叉树为Huffman树。具体例子往上有很多。
我们可以通过下面方法来搭建霍夫曼树!
class Huffman{ public Node[] nodes = null;//叶子节点 Node root = null; public Huffman(Node[] nodes){ this.nodes = nodes; } public Node createHuffman(){ Node[] newNodes = nodes; for(int i=0;i<nodes.length-1;i++) newNodes = sort(newNodes); return newNodes[0]; } // 取出nodes前两个小的node,然后组合成一个新的node,取代前面两个小的nodes。 // 其value为前面两个value之和。 // 将新的node的value与剩下的nodes进行排序。 public Node[] sort(Node[] nodes){ //将当前已经排序后的数组,前两个较小的nodes的w相加创建一个新的fatherNode,然后新的fathreNode的左子节点为前面较小的一个node //右子节点为较大的node Node fatherNode = new Node(‘ ‘,nodes[0].w+nodes[1].w,nodes[0].w>nodes[1].w?nodes[1]:nodes[0],nodes[0].w>nodes[1].w?nodes[0]:nodes[1]); Node[] newNodes = new Node[nodes.length-1]; //将新的fatherNode放在新的数组中的首位 newNodes[0] = fatherNode; //将原来的nodes中剩下的元素赋值到newNodes中来 for(int i=2;i<nodes.length;i++){ newNodes[i-1] =nodes[i]; } //针对newNodes进行排序!!!这里newNodes的右侧已经是一个有序的,只要找到 //合适位置,插入后,在进行移动即可! int j=0; for(;j<newNodes.length;j++){ if(newNodes[j].w>newNodes[0].w){ break; } } //j-1位置为目标位置,在j位置之前的node向前移动, Node tempNode = newNodes[0];//暂存newNodes[0]于tempNode for(int i=1;i<j;i++){ newNodes[i-1] = newNodes[i]; } //前面移动后,将存储node存入合适位置。 newNodes[j-1] = tempNode; return newNodes; } public Node getRoot(){ return root; } } class Node{ public char val; public int w; public Node lchild; public Node rchild; public Node(char val,int w,Node lchild,Node rchild){ this.val = val; this.w = w; this.lchild = lchild; this.rchild = rchild; } }
标签:return The span null ret node 路径 创建 最小
原文地址:https://www.cnblogs.com/dazhu123/p/12488103.html