亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言實現(xiàn)哈夫曼樹的構建

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

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

1、路徑和路徑長度

在一棵樹中,從一個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數(shù)目稱為路徑長度。若規(guī)定根結點的層數(shù)為1,則從根結點到第L層結點的路徑長度為L-1。

2、結點的權及帶權路徑長度

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

3、樹的帶權路徑長度

樹的帶權路徑長度規(guī)定為所有葉子結點的帶權路徑長度之和,記為WPL

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


/* 哈夫曼樹的結構體 */
typedef struct stHuNode
{
  int data; //權值
  struct stHuNode* lchild, *rchild;
}HUNODE;


/*
* 找出權值數(shù)組里面,最小的兩個權值下標
* 函數(shù)請參:HUNODE *pArray[] 存放節(jié)點的指針數(shù)組
      int n 數(shù)組里面的元素個數(shù)
      int* p1 存放最小權值的下標
      int* p2 存放第二小權值的下標
*/
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++)
  {
    /* 當前的下標下面是有節(jié)點的*/
    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ù)功能:構建哈夫曼樹
* 函數(shù)請參:int* a 權值數(shù)組
      int n 這個數(shù)組里面有多少個數(shù)據(jù)
*/

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

  int fir_small = 0, sec_small = 0;

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


  /* 先創(chuàng)建n個root節(jié)點*/
  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;

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

  /* 構建哈夫曼樹 */
  for(index = 0; index < n-1; index++)
  {
    /* fir_small 存放最小權值的下標 sec_small存放第二個小的權值下標*/
    findSmallData(pArray,n,&fir_small,&sec_small);

    /* 分配節(jié)點內(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é)點放入到指針數(shù)組里面去 */
    pArray[fir_small] = NULL;
    pArray[sec_small] = pNewNode;

  }
  return pNewNode;
}

/* 前序遍歷該二叉樹 */
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;

  /* 構建哈夫曼樹 */
  root = createHuTree(a,4);

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

  return 0;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C語言實現(xiàn)折半查找法(二分法)

    C語言實現(xiàn)折半查找法(二分法)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)折半查找法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言實現(xiàn)航班管理系統(tǒng)

    C語言實現(xiàn)航班管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)航班管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 關于C語言中參數(shù)的傳值問題

    關于C語言中參數(shù)的傳值問題

    C語言中參數(shù)的傳值一直比較含糊,今天在網(wǎng)上看到三個面試題的詳解,感覺講的很好,就拿來記下,方便學習和記憶
    2013-10-10
  • C++下程序運行時間的四種常用計時方法總結

    C++下程序運行時間的四種常用計時方法總結

    這篇文章主要介紹了C++下程序運行時間的四種常用計時方法,介紹了幾種常用的計時方法,包括低精度的clock()和GetTickCount(),以及高精度的gettimeofday()和QueryPerformanceCounter(),需要的朋友可以參考下
    2024-09-09
  • C++中神奇的tuple詳解使用技巧及實例解析

    C++中神奇的tuple詳解使用技巧及實例解析

    C++11標準新引入了一種類模板,命名為 tuple(中文可直譯為元組),下面這篇文章主要給大家介紹了關于C++中神奇的tuple詳解使用技巧及實例解析的相關資料,需要的朋友可以參考下
    2024-01-01
  • 詳解C語言 三大循環(huán) 四大跳轉 和判斷語句

    詳解C語言 三大循環(huán) 四大跳轉 和判斷語句

    這篇文章主要介紹了詳解C語言 三大循環(huán) 四大跳轉 和判斷語句的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • C++筆記-設置cout輸出數(shù)據(jù)的寬度和填充方式

    C++筆記-設置cout輸出數(shù)據(jù)的寬度和填充方式

    這篇文章主要介紹了C++筆記-設置cout輸出數(shù)據(jù)的寬度和填充方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言拓展實現(xiàn)Lua sleep函數(shù)

    C語言拓展實現(xiàn)Lua sleep函數(shù)

    這篇文章主要介紹了C語言拓展實現(xiàn)Lua sleep函數(shù),本文使用C語言寫出sleep函數(shù),編譯后在Lua中調(diào)用,需要的朋友可以參考下
    2015-04-04
  • CLion搭建配置C++開發(fā)環(huán)境的圖文教程 (MinGW-W64 GCC-8.1.0)

    CLion搭建配置C++開發(fā)環(huán)境的圖文教程 (MinGW-W64 GCC-8.1.0)

    這篇文章主要介紹了CLion搭建配置C++開發(fā)環(huán)境的教程 (MinGW-W64 GCC-8.1.0),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • C++實現(xiàn)走迷宮小游戲

    C++實現(xiàn)走迷宮小游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)走迷宮小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論