06 - 线索化二叉树和哈夫曼树

数据结构和算法学习汇总

线索化二叉树的认识

空链域的出现

  • 对于具有n个节点的二叉树,采用链式存储结构时,每个节点有两个指针域,总共有2n个指针域
  • 同时又由于只有n-1个节点被有效指针所指向(只有根节点没有被指向)
  • 所以共有2n-(n-1)=n+1个空链域


    空链域.png

线索:
我们知道遍历二叉树的结果是一个节点的线性序列,所以可以利用上面的空链域来存储指向节点的前驱节点和后继节点,这样的指向该线性序列中的前驱节点和后继节点的指针,称为线索。

线索二叉树
每个节点加上线索的二叉树叫做线索二叉树

规则:

  • 当某节点的左指针为空时,就令该指针指向按某种方式遍历二叉树时得到的该节点的前驱节点
  • 当某节点的右指针为空时,就令该指针指向按某种方式遍历二叉树时得到的该节点的后继节点

存储结构:

在节点的存储结构中增加两个标志位来区分左指针指向的节点到底是左孩子节点还是前驱节点,右指针同理


线索二叉树的节点存储结构.png

左标志ltag:

  • ltag == 0 表示lchild指向左孩子节点
  • ltag == 1 表示lchild指向前驱节点

右标志rtag:

  • rtag == 0 表示lchild指向右孩子节点
  • rtag == 1 表示lchild指向后继节点

优缺点:
优点:

  • 提高利用率,利用了被浪费的n+1个空链域
  • 提高遍历速度,存放线索,可以方便的查找前驱节点和后继节点

缺点:

  • 节点的插入和删除麻烦,且速度也比较慢
  • 线索子树不能共用

二叉树的线索化

对一个二叉树以某种方式遍历使其变为线索二叉树的过程就叫做二叉树的线索化

过程:
1、检查当前节点的左、右指针域是否为空
2、如果为空,将他们改为指向前驱节点或后继节点
3、创建一个头节点,并建立头节点和根节点之间的线索

线索化二叉树的遍历

介绍
遍历某种次序的线索二叉树,就是从该次序下的开始节点出发,找到当前节点在该次序下的后继节点,直到终端节点。

注:查找先序/后序前驱节点必须要知道该节点的双亲节点,而二叉链表中没有存放指向双亲的指针,因此实际使用中很少用到先序/后序线索二叉树,下面使用的是 中序线索二叉树分析

哈夫曼树的介绍

带权路径长度: 在许多应用中,常常将树中的节点赋上一个有某种意义的数值,称此数值为该节点的权,从树根节点到某节点之间的路径长度与该节点上权值的乘积称为该节点的带权路径长度。

WPL: 树中所有叶子节点的带权路径长度之和称为该树的带权路径长度,记为WPL

在n个带权叶子节点构成的所有二叉树中,带权路径长度WPL最小的二叉树称为哈夫曼树。

哈夫曼树.png

带权路径长度计算
1、WPL = 1 * 2 + 3 * 2 + 5 * 2 + 7 * 2 = 32
2、WPL = 1 * 2 + 3 * 3 + 5 * 3 + 7 * 1 = 33
3、WPL = 7 * 3 + 5 * 3 + 5 * 2 + 1 * 1 = 43
4、WPL = 1 * 3 + 3 * 3 + 5 * 3 + 7 * 1 = 29

经过计算发现第四个二叉树是哈夫曼树

可以具有确定权值的叶子节点可以构造出多个具有不同带权路径长度的二叉树,其中值最小的二叉树叫做哈夫曼树,这里第四个二叉树就是哈夫曼树

哈夫曼树的构造

给定n个权值,如何构造一棵含有n个给定权值的叶子节点的二叉树,使其带权路径长度WPL最小呢?

1、先将这n个权值作为带权值的根节点,左右子树均为空


第一步.png

2、选取权值最小的两颗树,分别作为左右子树构造一棵新的二叉树,其根节点的权值为左右子树根节点的权值之和


第二步.png

3、重复2步骤,直到把所有的节点都放到树上


第三步.png

注意:

  • 之前给定的权值,全都在叶子节点上,分支节点必须是叶子节点计算出来的结果
  • 权值越小的节点所在的层次越深

哈夫曼树的节点

{
char data;//节点值
double weight;//权重
int parent;//双亲节点
int lchild;//左孩子节点
int rchild;//右孩子节点
}

说明:

  • 为了方便的构造双亲节点,所以需要保存双亲节点
  • 为了计算权值,还需要加上本节点的权重信息

哈夫曼编码

来源:
在数据通信中,经常需要将传送的文字转换为二进制字符0和1组成的字符串,这个过程称为编码,显然,我们希望电文编码的代码长度最短,而通过哈夫曼树可以把电文编码的代码长度构造为最短。

实质: 哈夫曼编码的实质就是使用频率越高的字符采用越短的编码

构造方式:

  • 规定哈夫曼树中的左节点为0,右节点为1,
  • 则从根节点到每个叶子节点所经过的分支对应的0和1组成的序列便为该节点对应字符的编码
  • 这种编码方式就是哈夫曼编码

编码效果:

  • 出现次数较多的字符处于树的上方,这个字符的编码程度就短
  • 而且出现次数较多的元素编码长度短,出现次数较多的元素编码长度长,可以起到压缩效果
    • 因为可以根据编码长度来进行存储,而不是直接开辟最大的存储空间
    • 这样当有些字符并不需要这么大空间的时候就引起了浪费

优点:

  • 避免浪费空间,起到压缩效果,因为可以根据编码长度的大小来确定存储空间
  • 解决多义性问题,因为所有的叶子节点都是唯一的

总结:

  • 哈夫曼树就是所有叶子节点的带权路径最小的树,也叫做最优二叉树
  • 构造哈夫曼树的原理就是将权值最小的叶子节点放在最深层,权值越高的层级越小
  • 哈夫曼编码可以将使用频率越高的字符采用越短的编码
  • 具体做法就是将左节点作为0,右节点作为1,进行哈夫曼树构造
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容