2025-01-21 霍夫曼树
This commit is contained in:
parent
6036289d17
commit
be0d29a010
120
src/dataANDcalc/java/tree/HuffmanTree.java
Normal file
120
src/dataANDcalc/java/tree/HuffmanTree.java
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
package tree;
|
||||||
|
|
||||||
|
public class HuffmanTree {
|
||||||
|
|
||||||
|
private TreeNode[] arr;
|
||||||
|
|
||||||
|
private TreeNode huffTree;
|
||||||
|
|
||||||
|
public HuffmanTree(int[] arr){
|
||||||
|
this.arr = new TreeNode[arr.length];
|
||||||
|
for(int i=0; i<arr.length; i++){
|
||||||
|
this.arr[i] = new TreeNode(arr[i]);
|
||||||
|
}
|
||||||
|
sort();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建霍夫曼树
|
||||||
|
*/
|
||||||
|
public void createHuffTree(){
|
||||||
|
while(true){
|
||||||
|
TreeNode left = arr[0];
|
||||||
|
TreeNode right = arr[1];
|
||||||
|
TreeNode root = new TreeNode(arr[0].node + arr[1].node);
|
||||||
|
root.createHuffTreeNode(left, right);
|
||||||
|
if(arr.length == 2){
|
||||||
|
huffTree = root;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
createNodeArr(2, arr.length - 1, root);
|
||||||
|
sort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 剔除掉原数组的头两个结点并加入新生成的霍夫曼节点,重新创建数组
|
||||||
|
* @param left
|
||||||
|
* @param right
|
||||||
|
* @param node
|
||||||
|
*/
|
||||||
|
public void createNodeArr(int left, int right, TreeNode node){
|
||||||
|
TreeNode[] tempArr = new TreeNode[right - left + 2];
|
||||||
|
for(int i=0; i<tempArr.length - 1; i++){
|
||||||
|
tempArr[i] = arr[left];
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
tempArr[tempArr.length - 1] = node;
|
||||||
|
arr = tempArr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用希尔排序对结点数组进行排序
|
||||||
|
*/
|
||||||
|
private void sort(){
|
||||||
|
int gap = arr.length;
|
||||||
|
while(true){
|
||||||
|
// 每次步长为原来步长的一半,初始的步长为排序数组长度的一半
|
||||||
|
gap = gap/2;
|
||||||
|
// 分组进行插入排序
|
||||||
|
for (int i = gap; i <arr.length; i++){
|
||||||
|
// 获取本轮需要插入的数,并初始化一个下标为排序数组的最后一个下标
|
||||||
|
TreeNode temp = arr[i];
|
||||||
|
int index = i-gap;
|
||||||
|
// 当下标小于0就意味着已经完成本轮找位置的过程
|
||||||
|
// 如果当前插入的数小于下标指向的数,需要将当前下标数往后移动移位gap,并且下标要继续往前移动gap位
|
||||||
|
// 直到下标小于0或者当前插入数大于下标位置的数
|
||||||
|
while (index >=0 && temp.node < arr[index].node){
|
||||||
|
arr[index+gap] = arr[index];
|
||||||
|
index -= gap;
|
||||||
|
}
|
||||||
|
//将当前数插入到下标+gap的位置
|
||||||
|
arr[index+gap] = temp;
|
||||||
|
}
|
||||||
|
if (gap == 1){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void middleIterator(TreeNode treeNode){
|
||||||
|
if(treeNode == null){
|
||||||
|
System.out.println("当前节点为空");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (treeNode.left!= null){
|
||||||
|
middleIterator(treeNode.left);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println(treeNode.node);
|
||||||
|
|
||||||
|
if (treeNode.right!= null){
|
||||||
|
middleIterator(treeNode.right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TreeNode{
|
||||||
|
private int node;
|
||||||
|
|
||||||
|
private TreeNode left;
|
||||||
|
|
||||||
|
private TreeNode right;
|
||||||
|
|
||||||
|
public TreeNode(int node){
|
||||||
|
this.node = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createHuffTreeNode(TreeNode left, TreeNode right){
|
||||||
|
this.left = left;
|
||||||
|
this.right = right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int[] arr = new int[]{13,7,8,3,29,6,1};
|
||||||
|
HuffmanTree huffmanTree = new HuffmanTree(arr);
|
||||||
|
huffmanTree.createHuffTree();
|
||||||
|
huffmanTree.middleIterator(huffmanTree.huffTree);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user