最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)哈夫曼樹(shù)的構(gòu)建

 更新時(shí)間:2020年04月28日 11:11:11   作者:dmfrm  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)哈夫曼樹(shù)的構(gòu)建,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

哈夫曼樹(shù)(霍夫曼樹(shù))又稱為最優(yōu)樹(shù).

1、路徑和路徑長(zhǎng)度

在一棵樹(shù)中,從一個(gè)結(jié)點(diǎn)往下可以達(dá)到的孩子或?qū)O子結(jié)點(diǎn)之間的通路,稱為路徑。通路中分支的數(shù)目稱為路徑長(zhǎng)度。若規(guī)定根結(jié)點(diǎn)的層數(shù)為1,則從根結(jié)點(diǎn)到第L層結(jié)點(diǎn)的路徑長(zhǎng)度為L(zhǎng)-1。

2、結(jié)點(diǎn)的權(quán)及帶權(quán)路徑長(zhǎng)度

若將樹(shù)中結(jié)點(diǎn)賦給一個(gè)有著某種含義的數(shù)值,則這個(gè)數(shù)值稱為該結(jié)點(diǎn)的權(quán)。結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度為:從根結(jié)點(diǎn)到該結(jié)點(diǎn)之間的路徑長(zhǎng)度與該結(jié)點(diǎn)的權(quán)的乘積。

3、樹(shù)的帶權(quán)路徑長(zhǎng)度

樹(shù)的帶權(quán)路徑長(zhǎng)度規(guī)定為所有葉子結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度之和,記為WPL

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/* 哈夫曼樹(shù)的結(jié)構(gòu)體 */
typedef struct stHuNode
{
  int data; //權(quán)值
  struct stHuNode* lchild, *rchild;
}HUNODE;


/*
* 找出權(quán)值數(shù)組里面,最小的兩個(gè)權(quán)值下標(biāo)
* 函數(shù)請(qǐng)參:HUNODE *pArray[] 存放節(jié)點(diǎn)的指針數(shù)組
      int n 數(shù)組里面的元素個(gè)數(shù)
      int* p1 存放最小權(quán)值的下標(biāo)
      int* p2 存放第二小權(quán)值的下標(biāo)
*/
int findSmallData(HUNODE *pArray[] ,int n,int* p1, int* p2)
{
  int index = 0;
  int fir_small = 0xffff, sec_small = 0xffff;

  if(pArray == NULL)
  {
    return 1;
  }

  for(index = 0; index < n; index++)
  {
    /* 當(dāng)前的下標(biāo)下面是有節(jié)點(diǎn)的*/
    if(pArray[index] != NULL)
    {
      if(pArray[index]->data < fir_small)
      {
        sec_small = fir_small;
        fir_small = pArray[index]->data;

        *p2 = *p1;
        *p1 = index;        
      }
      else if(pArray[index]->data < sec_small)
      {
        sec_small = pArray[index]->data;
        *p2 = index;
      }
    }    
  }

  return 0;
}
/*
* 函數(shù)功能:構(gòu)建哈夫曼樹(shù)
* 函數(shù)請(qǐng)參:int* a 權(quán)值數(shù)組
      int n 這個(gè)數(shù)組里面有多少個(gè)數(shù)據(jù)
*/

HUNODE* createHuTree(int* a, int n) 
{
  int index = 0;

  int fir_small = 0, sec_small = 0;

  /* 定義一個(gè)指針數(shù)組,最大是100 */
  HUNODE *pArray[100];
  HUNODE *pNewNode = NULL;


  /* 先創(chuàng)建n個(gè)root節(jié)點(diǎn)*/
  memset(pArray,0,sizeof(HUNODE)*n);
  for(index = 0; index < n; index++)
  {
    pNewNode = (HUNODE*)malloc(sizeof(HUNODE));
    memset(pNewNode,0,sizeof(HUNODE));

    pNewNode->data = a[index];
    pNewNode->lchild = NULL;
    pNewNode->rchild = NULL;

    /* 把這個(gè)節(jié)點(diǎn)存放在指針數(shù)組中去 */
    pArray[index] = pNewNode;
  }

  /* 構(gòu)建哈夫曼樹(shù) */
  for(index = 0; index < n-1; index++)
  {
    /* fir_small 存放最小權(quán)值的下標(biāo) sec_small存放第二個(gè)小的權(quán)值下標(biāo)*/
    findSmallData(pArray,n,&fir_small,&sec_small);

    /* 分配節(jié)點(diǎn)內(nèi)存 */
    pNewNode = (HUNODE*)malloc(sizeof(HUNODE));
    memset(pNewNode,0,sizeof(HUNODE)); 

    pNewNode->data = pArray[fir_small]->data + pArray[sec_small]->data;

    /* 最小的是左孩子,第二小的是右孩子 */
    pNewNode->lchild = pArray[fir_small];
    pNewNode->rchild = pArray[sec_small];

    /* 把新的節(jié)點(diǎn)放入到指針數(shù)組里面去 */
    pArray[fir_small] = NULL;
    pArray[sec_small] = pNewNode;

  }
  return pNewNode;
}

/* 前序遍歷該二叉樹(shù) */
void preOrderHuffMan(HUNODE* root)
{
  if(root)
  {
    printf("%d ",root->data);
    preOrderHuffMan(root->lchild);
    preOrderHuffMan(root->rchild);
  }
}

int main()
{
  int a[4] = {7,5,2,4};
  HUNODE* root = NULL;

  /* 構(gòu)建哈夫曼樹(shù) */
  root = createHuTree(a,4);

  /* 前序遍歷 */
  preOrderHuffMan(root);
  printf("\n");

  return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入淺析 C++ 調(diào)用 Python 模塊

    深入淺析 C++ 調(diào)用 Python 模塊

    Python 提供了 C++ 庫(kù),使得開(kāi)發(fā)者能很方便地從 C++ 程序中調(diào)用 Python 模塊。接下來(lái)通過(guò)本文給大家介紹 C++ 調(diào)用 Python 模塊的相關(guān)知識(shí),需要的朋友參考下吧
    2016-03-03
  • C語(yǔ)言 指針數(shù)組詳解及示例代碼

    C語(yǔ)言 指針數(shù)組詳解及示例代碼

    本文主要介紹C語(yǔ)言 指針數(shù)組,這里提供詳細(xì)的資料和簡(jiǎn)單示例代碼以便大家學(xué)習(xí)參考,有需要學(xué)習(xí)的小伙伴可以參考下
    2016-08-08
  • Qt數(shù)據(jù)庫(kù)應(yīng)用之超級(jí)自定義委托

    Qt數(shù)據(jù)庫(kù)應(yīng)用之超級(jí)自定義委托

    Qt中需要用到自定義委托的情形很多,比如提供下拉框選擇,進(jìn)度條展示下載進(jìn)度啥的,默認(rèn)的單元格是沒(méi)有這些效果的,需要自己?jiǎn)为?dú)用委托的形式來(lái)展示。本文將為大家介紹Qt中如何進(jìn)行超級(jí)自定義委托,需要的可以參考一下
    2022-03-03
  • C++ BloomFilter布隆過(guò)濾器應(yīng)用及概念詳解

    C++ BloomFilter布隆過(guò)濾器應(yīng)用及概念詳解

    布隆過(guò)濾器是由布?。˙urton Howard Bloom)在1970年提出的 一種緊湊型的、比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu),特點(diǎn)是高效地插入和查詢,可以用來(lái)告訴你 “某樣?xùn)|西一定不存在或者可能存在”,它是用多個(gè)哈希函數(shù),將一個(gè)數(shù)據(jù)映射到位圖結(jié)構(gòu)中
    2023-03-03
  • C++類模板與模板類深入詳解

    C++類模板與模板類深入詳解

    這篇文章主要介紹了C++類模板與模板類深入詳解,需要的朋友可以參考下
    2014-07-07
  • 詳細(xì)分析C++ 異常處理

    詳細(xì)分析C++ 異常處理

    這篇文章主要介紹了C++ 異常處理的的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C語(yǔ)言中的四種常量詳解

    C語(yǔ)言中的四種常量詳解

    本篇文章是c語(yǔ)言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說(shuō)明)請(qǐng)大家持續(xù)關(guān)注腳本之家
    2021-10-10
  • C++線程池實(shí)現(xiàn)

    C++線程池實(shí)現(xiàn)

    線程池是一種并發(fā)編程技術(shù),通過(guò)預(yù)先創(chuàng)建一組線程并復(fù)用它們來(lái)執(zhí)行多個(gè)任務(wù),避免了頻繁創(chuàng)建和銷(xiāo)毀線程的開(kāi)銷(xiāo),本文就來(lái)介紹一下C++線程池實(shí)現(xiàn),感興趣的可以了解一下
    2025-02-02
  • C++文件讀取的4種情況匯總

    C++文件讀取的4種情況匯總

    前幾天要用到C++讀取文本文件,就學(xué)習(xí)了一下幾種不同的讀取方法,下面這篇文章主要給大家介紹了關(guān)于C++文件讀取的4種情況,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • C語(yǔ)言如何在指針中隱藏?cái)?shù)據(jù)詳解

    C語(yǔ)言如何在指針中隱藏?cái)?shù)據(jù)詳解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何在指針中隱藏?cái)?shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2018-12-12

最新評(píng)論

乐陵市| 红安县| 饶阳县| 巫溪县| 道孚县| 龙南县| 溧水县| 富平县| 南溪县| 寿宁县| 廉江市| 溧阳市| 贵南县| 缙云县| 古蔺县| 陵川县| 阳高县| 温州市| 息烽县| 疏附县| 抚宁县| 呼玛县| 镇江市| 栖霞市| 高州市| 嘉鱼县| 鄂温| 麻阳| 乌拉特中旗| 正镶白旗| 大连市| 罗源县| 通河县| 灌南县| 宁武县| 大城县| 怀集县| 平陆县| 丰顺县| 法库县| 吉安县|