数据结构之二叉树,二叉树存储结构,二叉树遍历,霍夫曼树以及图解

数据结构之二叉树

什么是树?

树是一种一对多的数据结构。树有很多子集,比如:二叉树、完全二叉树、满二叉树、二叉搜索树等等。

树的特征:

  1. 没有父结点的叫做根,一个树有且只有一个根;
  2. 每个结点有0个或者多个子结点;
  3. 一棵树可以拥有子树,且不能相交;

树的案例:

 

什么是度:

每个结点拥有的子结点数量称为该结点的度。如上图D的结点度为3,度为0的结点称为叶结点,也就是没有子结点的结点。

 

树的深度

树中结点最大层次树称为树的深度或高度。

 

二叉树

二叉树是一种特殊的树,二叉树的特征:

  1. 每个结点最多有2个子结点的树,也就是不存在度大于2的情况
  2. 左右子树有一定的顺序(比如升序和降序),次序不能颠倒
  3. 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树

 

 

二叉树性质:

  1. 在二叉树的第i层上最对有2^-1个节点,(i >= 1)
  2. 二叉树中如果深度为k,那么最多有2^k-1个节点,(k >=1)
  3. n0 = n2 + 1;n0表示度数为0的节点数(就是没有子节点的结点,可以理解成叶结点),n2表示度数为2的节点数。
  4. 在完全二叉树中,具有n个节点的完全二叉树深度为【log2n】+1,其中【log2n】是向下取整的
  5. 若对含n个结点的完全二叉树从上到下从左到右进行1至n的编号,则对完全二叉树中任意一个编号为i的结点有以下特征:
  1. 若i=1;则该结点是二叉树的根,无双亲;否则,编号为【i/2】的结点为其双亲结点;
  2. 若2i>n;则该结点无左孩子,否则编号2i的结点为左孩子结点
  3. 若2i + 1 > n;则该结点无右孩子,否则2i+1的结点为右孩子结点

 

满二叉树:

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

也是所有非叶结点的子结点个数都为2,看起来呈水平对称。

特点:

  1. 叶子结点只能出现在最下面一层
  2. 非叶结点的度一定是2
  3. 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多

 

完全二叉树:

特征:

  1. 该树非最后一层的结点都是满的
  2. 最后一层的叶结点必须集中在左边,也就是不允许倒数第二层的结点只有右子结点而没有左子结点
  3. 同样结点数目的二叉树,完全二叉树深度最小

满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树

 

 

二叉树的存储结构

  1. 顺序存储

二叉树的顺序存储结构就是使用一维数组存储二叉树中的结点,并且结点的存储位置就是数组下表索引。

 

采用顺序存储,是合理的

 

当二叉树不为完全二叉树时

 

顺序存储结构图

 

其中^表示此位置没有存储结点,已经出现了空间浪费

因此:顺序存储一般适用于完全二叉树

 

2.二叉链表

既然顺序存储不能满足二叉树的存储要求,那么考虑采用链式存储,有二叉树的定义而知,二叉树的每个结点最多有两个子结点,因此可以将结点数据结构定义成一个数据和两个指针域。

图示:

Lchild(左孩子指针)

Data(数据域)

Rchild(右孩子指针)

 

 

链表结构存储二叉树,称为二叉链表

 

二叉树遍历

二叉树遍历指从二叉树的根结点出发,按照某种次序访问二叉树中的所有结点,使得每个结点都被访问一次,且仅被访问一次。

访问次序可以分为四种:

  1. 前序遍历

从根结点出发,当第一次到达结点就输出结点数据,按照先左再右的方向访问

如图:

 

执行步骤:

从根结点,第一次到达A,输出A

继续向左,到达B,输出B

同样规则输出D、H

当到达叶结点H,返回D,此时已经第二次到达D,不再输出,开始向D右子树访问,不为空,访问到I,输出I

I为叶结点返回D,D的左右子结点访问完毕,返回到B,B右子树不为空,访问到E,输出E,依次类推

最终输出:ABDHIEJCFG

 

  1. 中序遍历

从根结点出发,每二次到达结点时就输出结点数据,按照先左后右

最终输出:HDIBJEAFCG

 

  1. 后序遍历

从二叉树根结点出发,每三次到达的结点时就输出该结点数据,按照先左后右

最终输出:HIDJEBFGCA

 

  1. 层次遍历

按照树的层次自上而下的遍历二叉树

最终输出:ABCDEFGHIJ

 

 

二叉树之霍夫曼树

霍夫曼树是二叉树的一种特殊方式,又称最优二叉树,其主要作用在于数据压缩和编码长度的优化。

  1. 路径和路径长度

路径:从一棵树中,从一个结点往下可以到达孩子或者孙子结点之间的通路叫做路径,通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1

 

A到D路径长度为2,A到C路径长度为1

 

  1. 结点的权以及带权路径的长度

权:若数中结点赋有某种含义的数值,把这个数值称为权

带权路径的长度:从根结点到该结点之间的路径长度与该结点的权的乘积

 

 

树的带权路径长度=所有叶子结点的带权路径长度之和,记做WPL

WPL=6*2+3*2+8*2

 

霍夫曼树

给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称霍夫曼树。

 

 

3.1.a WPL = 7*2 + 5*2 + 2*2 + 4*2=36

3.2.a WPL = 7*1 + 5*2 + 2*3 + 4*3=35

由ABCD构成叶子结点的二叉树形态有许多种,但是WPL最小的树只有3.1.b所示的形态。则3.1.b树为一棵霍夫曼树。

 

 

 

二叉排序树

二叉排序树又称二叉查找树,也称二叉搜索树。

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

  1. 若左子树不能空,则左子树上所有结点的值均小于或等于它的根结点的值
  2. 若右子树不能空,则左子树上所有结点的值均大于或等于它的根结点的值
  3. 左右子树也分别为二叉排序树

例子:

现有序列:61 87 59 47 35 73 51 98 37 93

索引 i = 0,A[i] = 61,结点61作为根结点

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值