数据结构————哈夫曼树

简介: 哈夫曼树c++版

数据结构——哈夫曼树

哈夫曼树又被称为最优二叉树,是指一类带权路径长度最小的二叉树,
哈夫曼树的遍历不是唯一的,因为在构造树的时候左右子树的位置是不同的。
哈夫曼树的构造思想如下

1:在给定权值的结点集合中,每个结点都是一颗独立的二叉树,并且左右子树为空,且只有一个根结点。
2:在集合中找到俩个最小的结点,并且组成一个新的结点,这俩个最小的分别为这个新结点的左右子树。新的结点为这两个结点的根结点。并且删除这俩个最小的结点,将新组成的结点添加集合中。
3:直到集合中元素长度不为1的时候 重复2

例如:
{1,2,3,4}构成的哈夫曼树是什么?
1

在这里用链表实现,因为经常要删除和添加,链表比较好。
流程图如下
_


代码如下:

//  main.cpp
//  hafuman
//
//  Created by 橘子和香蕉 on 2018/11/22.
//  Copyright © 2018 橘子和香蕉. All rights reserved.
//

#include <iostream>
using namespace std;
typedef struct node{
    int data;
    node * parent;
    node *lchild;
    node *rchild;
    node *next;
}node;

class Tree{
private:
    node* head;
    node *hufmTreeHead;
    int length;
#pragma 私有函数声明
    void inorderNode(node *p);//中序遍历
    void findMinNodeandDelete(node *&p);//找最小的结点并且删除掉
    void addNode(node *p1);//两个参数组成一个新的结点然后添加这个新的结点
public:
    Tree(){head = new node; head->lchild = head->rchild=head->parent=head->next =  NULL;hufmTreeHead = NULL; }
    void initTreeList();//创建一条链表
    void createHufmTree();//创建一个二叉树
    void inorderTree();//中序遍历
    void printNode();//输出所有链表中的结点
};
#pragma 私有函数的实现开始
void Tree::inorderNode(node *p){
    if(p ==  NULL) return;
    else{
        inorderNode(p->lchild);
        cout<<"data: "<<p->data<<"\n";
        inorderNode(p->rchild);
    }
}
void Tree::findMinNodeandDelete(node *&p){
    /*查找分为两步;
     1:遍历链表,找到最小值所在的结点的位置,记下这个位置
     2:遍历链表,找个这个结点。
     
     因为不能在第一遍遍历链表的时候同时删除这个最小值所在的单向链表。同时也不能删除这个结点,因为这个结点还是留下来联接。
     */
    node *h1 = head;
    node *h = h1->next;
    int min = INT_MAX;
    while ( h != NULL) {
        if(h->data < min){
            min = h->data;
            p = h;
        }
        h = h->next;
    }
    h = h1->next;
    while (h != NULL) {
        if(h == p){
            h1->next = h->next;
            break;
        }
        h1 = h;
        h = h->next;
    }
    length--;//删除一个结点length-1;
}
void Tree::addNode(node *p){
    
    //头插法添加结点每次添加的都是在结点的头部
    p->next = head->next;
    head->next = p;
    length++;//添加一个新的结点length++;
}

#pragma 私有函数实现结束


#pragma 公有函数实现开始
void Tree::initTreeList(){
    cout<<"input data length:\n";
    int length;
    cin>>length;
    this->length = length;//数据长度
    cout<<"begin  input node data:\n";
    int data = 0;
    node *h = head;
    node* p;
    for (int i = 0; i<length; i++) {
        cout<<"input data: \t";
        cin>>data;
        p = new node;
        p->data= data;
        p->lchild = p->rchild=p->parent=p->next =  NULL;
        h->next = p;
        h = p;
        
    }
    
}
void Tree::createHufmTree(){
    node *p1,*p2;//找到的新结点
    while (length > 1) {
        findMinNodeandDelete(p1);
        findMinNodeandDelete(p2);
        node *n  = new node;//通过p1和p2组成一个新的结点;
        n->data = p1->data+p2->data;
        n->lchild = p1;
        n->rchild = p2;
        n->next = NULL;
        p1->parent = p2->parent = n;
        addNode(n);
    }
    hufmTreeHead = head->next;
    cout<<"hufmanHead:"<<hufmTreeHead->data<<endl;
}

void Tree::inorderTree(){
    cout<<"inorderTree-------------------------------------------\n";
    node *p = hufmTreeHead;
    inorderNode(p);
    cout<<endl;
    cout<<"inorderTree___________________________________________\n";
}

void Tree::printNode(){
    cout<<endl;
    cout<<"printNode begin---------------------------\n";
    node *h = head->next;
    cout<<"length"<<length<<";";
    while (h !=  NULL) {
        cout<<"h->data:"<<h->data<<endl;
        h = h->next;
    }
    cout<<"printNode finish_____________________\n";
}

#pragma 公有函数的实现的结束
int main(){
    Tree t;
    t.initTreeList();
    t.printNode();
    t.createHufmTree();
    t.inorderTree();
    return 1;
}

相关文章
|
存储 算法 C语言
C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作
C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作
|
2月前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
5月前
|
机器学习/深度学习 存储
数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
140 1
|
6月前
|
编译器
【数据结构】哈夫曼树编译码器【课程设计】
【数据结构】哈夫曼树编译码器【课程设计】
|
存储 算法
数据结构实验十二 哈夫曼树及编码
数据结构实验十二 哈夫曼树及编码
96 0
|
6月前
|
算法 Java
数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!
数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!
2891 0
|
C语言
c语言数据结构-哈夫曼树
c语言数据结构-哈夫曼树
103 0
数据结构——哈夫曼树
哈夫曼树 · 前言 哈夫曼树又叫做最优二叉树,可以将其看作一种特殊的二叉树。 可以说是从堆引入的哈夫曼树;堆的作用是构造最大堆和最小堆实现挑选最值删除的东西,而哈夫曼树也是寻找max和min并对其进行操作。 哈夫曼树的原理:出现频率较高的数占空间小,出现频率较低的数占空间更大。从而实现不压缩数据且节省空间的一种存储方式。
数据结构——哈夫曼树
|
存储 算法
【开卷数据结构 】哈夫曼树
【开卷数据结构 】哈夫曼树
117 0
|
算法
大话数据结构--哈夫曼树及其应用
大话数据结构--哈夫曼树及其应用
126 0