C/Visual C - ESTUDIANTE

 
Vista:

ESTUDIANTE

Publicado por POLO (2 intervenciones) el 10/06/2003 19:19:54
HOLA ESPERO ME PUEDADN AYUDAR TENGO QUE REALIZAR UN PROGRAMA EN C++, DE ARBOLES ES DECIR, TENGO QUE HACER EL CODIGO DE HUFFMAN EN C++.

PERO NO SE COMO, MIRA TENGO UNA ESTRUCTURA QUESELLAMA ARBOL
EN LA CUAL TENGO LOS SIGUIENTES DATOS:

struct nodo
{

int hd;
int hi;
char dato
}arbol[10]

hd es para el hijo derecho,
hi es para el hijo izquierdo
dato es para el dato del arbol

pero como los pido, o como le voy a hecer para que al intrioducir una palabra yo le de en que direccion esta.

claro teniendo las letras en el arbol con su respectiva frecuencia..

espero me puedadn ayudar ....

gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Implementación del algoritmo de Huffman en C++

Publicado por Alejandro (1222 intervenciones) el 03/07/2025 17:54:34
Para implementar el algoritmo de Huffman en C++, primero necesitas entender cómo funciona el árbol de Huffman. Este algoritmo se utiliza para la compresión de datos y se basa en la frecuencia de los caracteres en un texto. A continuación, te proporcionaré un ejemplo básico de cómo puedes implementar un árbol de Huffman utilizando la estructura que has proporcionado.

Estructura del nodo



Primero, definimos la estructura del nodo y algunas funciones necesarias para construir el árbol de Huffman.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <queue>
#include <vector>
#include <unordered_map>
#include <string>
 
using namespace std;
 
struct Nodo {
    int frecuencia;
    char dato;
    int hi; // Índice del hijo izquierdo
    int hd; // Índice del hijo derecho
 
    // Constructor
    Nodo(int f, char d) : frecuencia(f), dato(d), hi(-1), hd(-1) {}
};
 
// Comparador para la cola de prioridad
struct Comparador {
    bool operator()(const Nodo* a, const Nodo* b) {
        return a->frecuencia > b->frecuencia; // Menor frecuencia tiene mayor prioridad
    }
};
 
// Función para construir el árbol de Huffman
Nodo* construirArbolHuffman(const vector<pair<char, int>>& frecuencias) {
    priority_queue<Nodo*, vector<Nodo*>, Comparador> cola;
 
    // Crear nodos y agregarlos a la cola de prioridad
    for (const auto& par : frecuencias) {
        cola.push(new Nodo(par.second, par.first));
    }
 
    // Construir el árbol
    while (cola.size() > 1) {
        Nodo* izquierda = cola.top(); cola.pop();
        Nodo* derecha = cola.top(); cola.pop();
 
        // Crear un nuevo nodo que combine los dos nodos
        Nodo* nuevoNodo = new Nodo(izquierda->frecuencia + derecha->frecuencia, '\0');
        nuevoNodo->hi = izquierda->frecuencia; // Guardar la frecuencia del hijo izquierdo
        nuevoNodo->hd = derecha->frecuencia;   // Guardar la frecuencia del hijo derecho
 
        // Agregar el nuevo nodo a la cola
        cola.push(nuevoNodo);
    }
 
    return cola.top(); // Retornar la raíz del árbol
}
 
// Función para imprimir el árbol de Huffman
void imprimirArbol(Nodo* raiz, const string& codigo) {
    if (!raiz) return;
 
    // Si es una hoja, imprimir el carácter y su código
    if (raiz->dato != '\0') {
        cout << "Carácter: " << raiz->dato << " Código: " << codigo << endl;
    }
 
    // Recursión para los hijos izquierdo y derecho
    imprimirArbol(raiz->hi, codigo + "0");
    imprimirArbol(raiz->hd, codigo + "1");
}
 
int main() {
    // Frecuencias de los caracteres
    vector<pair<char, int>> frecuencias = {
        {'a', 5},
        {'b', 9},
        {'c', 12},
        {'d', 13},
        {'e', 16},
        {'f', 45}
    };
 
    // Construir el árbol de Huffman
    Nodo* raiz = construirArbolHuffman(frecuencias);
 
    // Imprimir los códigos de Huffman
    cout <<"Códigos de Huffman:" << endl;
    imprimirArbol(raiz, "");
 
    return 0;
}

Explicación del código



1. Estructura del nodo: La estructura `Nodo` contiene la frecuencia, el carácter, y los índices de los hijos izquierdo y derecho.

2. Cola de prioridad: Utilizamos una cola de prioridad para construir el árbol de Huffman. Los nodos con menor frecuencia tienen mayor prioridad.

3. Construcción del árbol: La función `construirArbolHuffman` toma un vector de pares de caracteres y sus frecuencias, y construye el árbol de Huffman.

4. Impresión del árbol: La función `imprimirArbol` recorre el árbol y genera los códigos de Huffman para cada carácter.

5. Ejemplo de frecuencias: En el `main`, se definen algunas frecuencias de ejemplo para los caracteres.

Conclusión



Este código te proporciona una base para implementar el algoritmo de Huffman en C++. Puedes expandirlo para incluir la codificación y decodificación de cadenas, así como la gestión de memoria para liberar los nodos del árbol. ¡Buena suerte con tu proyecto, Polo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar