一、定义

树(Tree)是n(n≥0)个结点的有限集,n=0时,称为空树。在任意一棵非空树中:

(1)有且仅有一个特定的称为根(Root)的结点

(2)当n>1时,其余结点可以划分为m(m>0)个互不相交的有限集T1、T2 、…、Tm,每个集Ti(1≤i≤m)均为树,且称为树T的子树(SubTree)。

这里写图片描述

下图的T1和T2是结点A的子树,E、J组成的树是C为结点的子树

这里写图片描述

二、基本术语

结点:存储数据元素和指向子树的链接,由数据元素和构造数据元素之间关系的引用组成。

结点的度:结点所有子树的个数称为该结点的度,上图中B的度为1,C的度为2。

叶子结点:度为0的结点称为叶子结点,也叫终端结点,G、H、I、J、F都是叶子结点。

分支结点:度不为0的结点称为分支结点,也叫非终端结点。如A、B、C、D、E。

树的度:树中所有结点的度的最大值称为树的度,树的度为3。

孩子结点:结点的子树的根称为该结点的孩子,A的孩子结点有B、C。

双亲结点:树中某个结点有孩子结点(即该结点的度不为0),该结点称为它孩子结点的双亲结点,也叫前驱结点。双亲结点和孩子结点是相互的,如B、C的双亲结点是A。

兄弟结点:具有相同双亲结点(即同一个前驱)的结点称为兄弟结点,如B、C是兄弟结点。

这里写图片描述

树中任意一个结点的各子树按从左到右是有序的,称为有序树,否则称为无序树。

树是一种递归结构,表示方式一般有孩子表示法和孩子兄弟表示法两种。树实现方式有很多种、有可以由广义表的递归实现,也可以有二叉树实现,其中最常见的是将树用孩子兄弟表示法转化成二叉树来实现。

这里写图片描述

三、二叉树

二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两颗互不交互的、分别称为根节点的左子树和右子树的二叉树组成。

满二叉树:在一棵二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树就称为满二叉树。

这里写图片描述

如果一棵具有n个结点的二叉树的结构与满二叉树的前n个结点的结构相同,这样的二叉树称作完全二叉树。

这里写图片描述

二叉树的性质:

性质1:在二叉树的第i层上之多有2^i-1个结点(i>=1);

性质2:深度为K的二叉树至多有2^k-1个结点(k>=1);

性质3:对于任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。

性质4:具有n个结点的完全二叉树的深度为【log2n】+1(【x】表示不大于x的最大整数)

性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第⎣l og2n⎦ +1层,每层从左到右),则对任一结点i(1≤i≤n),有:

(1)如果i=1,则结点i无双亲,是二叉树的根;如果i>1,则其双亲是结点⎣i/2⎦。

(2) 如果2i<=n, 则结点i的左孩子结点是2i;否则,结点i为叶子结点,无左孩子结点。

(3)如果2i+1<=n,则结点i的右孩子是结点2i+1; 否则,结点i为叶子结点,无右孩子结点。

四、二叉树的存储结构

1.二叉树的顺序存储结构:

这里写图片描述

这里写图片描述

2.二叉链表

二叉树每个结点最多有两个孩子,所以为它涉及一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表。如图所示:

这里写图片描述

结构示意图:

这里写图片描述

五、遍历二叉树

1.前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树。如图所示:(根左右),遍历顺序为ABDGHCEIF

这里写图片描述

2.中序遍历:(左根右),遍历顺序为GDHBAEICF

3.后序遍历(左右根),遍历顺序为GHDBIEFCA

4.层序遍历:ABCDEFGHI

前序遍历算法:

这里写图片描述

中序遍历算法:

这里写图片描述

后序遍历算法:

这里写图片描述

六、赫夫曼树及其应用

假设有n个权值,构造一棵有n个叶子结点的二叉树,其中带权路径最小的二叉树称做赫夫曼树。

这里写图片描述

树的路径长度就是从树根到每一个结点的路径长度之和。设第一棵树为a,第二棵为b,a树路径长度为1+1+2+2+3+3+4+4=20,b的路径长度为16。a的带权路径为5*1+15*2+40*3+30*4+10*4=315,b的带权路径为220。

霍夫曼树的构造:
一、对给定的n个权值{W1,W2,W3,…,Wi,…,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,…,Ti,…,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算 法,一般还要求以Ti的权值Wi的升序排列。)
二、在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
三、从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
四、重复二和三两步,直到集合F中只有一棵二叉树为止。

赫夫曼编码:
一般地,设需要编码的字符集为{d1,d2,……dn},各字符在电文中出现的次数或频率的集合为{w1,w2,……wn},以d1,d2,……dn作为叶子结点,以w1,w2,……wn作为相应叶子结点的权值来构造一棵霍夫曼树。规定霍夫曼树的左分支代表0,右分支代表1,则从根节点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符编码,这就是霍夫曼编码。
例子:我们在发送电报的时候用到了六个字母,其出现的概率分别为:A 27,B 8,C 15, D 15,E 30,F 5,合起来正好是百分之百。

怎么获得霍夫曼编码呢?

首先按照比率作为权值画霍夫曼树,然后将左分支代表0,右分支代表1,如图:

这里写图片描述

从根节点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符编码,即:

这里写图片描述

用简单的二进制数据表示:

这里写图片描述

对比一下,就可以看到赫夫曼编码所用到的空间明显小于二进制编码。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值