数据结构之二叉树
树
什么是树?
树是一种一对多的数据结构。树有很多子集,比如:二叉树、完全二叉树、满二叉树、二叉搜索树等等。
树的特征:
- 没有父结点的叫做根,一个树有且只有一个根;
- 每个结点有0个或者多个子结点;
- 一棵树可以拥有子树,且不能相交;
树的案例:
度
什么是度:
每个结点拥有的子结点数量称为该结点的度。如上图D的结点度为3,度为0的结点称为叶结点,也就是没有子结点的结点。
树的深度
树中结点最大层次树称为树的深度或高度。
二叉树
二叉树是一种特殊的树,二叉树的特征:
- 每个结点最多有2个子结点的树,也就是不存在度大于2的情况
- 左右子树有一定的顺序(比如升序和降序),次序不能颠倒
- 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树
二叉树性质:
- 在二叉树的第i层上最对有2^-1个节点,(i >= 1)
- 二叉树中如果深度为k,那么最多有2^k-1个节点,(k >=1)
- n0 = n2 + 1;n0表示度数为0的节点数(就是没有子节点的结点,可以理解成叶结点),n2表示度数为2的节点数。
- 在完全二叉树中,具有n个节点的完全二叉树深度为【log2n】+1,其中【log2n】是向下取整的
- 若对含n个结点的完全二叉树从上到下从左到右进行1至n的编号,则对完全二叉树中任意一个编号为i的结点有以下特征:
- 若i=1;则该结点是二叉树的根,无双亲;否则,编号为【i/2】的结点为其双亲结点;
- 若2i>n;则该结点无左孩子,否则编号2i的结点为左孩子结点
- 若2i + 1 > n;则该结点无右孩子,否则2i+1的结点为右孩子结点
满二叉树:
在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
也是所有非叶结点的子结点个数都为2,看起来呈水平对称。
特点:
- 叶子结点只能出现在最下面一层
- 非叶结点的度一定是2
- 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多
完全二叉树:
特征:
- 该树非最后一层的结点都是满的
- 最后一层的叶结点必须集中在左边,也就是不允许倒数第二层的结点只有右子结点而没有左子结点
- 同样结点数目的二叉树,完全二叉树深度最小
满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树
二叉树的存储结构
- 顺序存储
二叉树的顺序存储结构就是使用一维数组存储二叉树中的结点,并且结点的存储位置就是数组下表索引。
采用顺序存储,是合理的
当二叉树不为完全二叉树时
顺序存储结构图
其中^表示此位置没有存储结点,已经出现了空间浪费
因此:顺序存储一般适用于完全二叉树
2.二叉链表
既然顺序存储不能满足二叉树的存储要求,那么考虑采用链式存储,有二叉树的定义而知,二叉树的每个结点最多有两个子结点,因此可以将结点数据结构定义成一个数据和两个指针域。
图示:
Lchild(左孩子指针) | Data(数据域) | Rchild(右孩子指针) |
链表结构存储二叉树,称为二叉链表
二叉树遍历
二叉树遍历指从二叉树的根结点出发,按照某种次序访问二叉树中的所有结点,使得每个结点都被访问一次,且仅被访问一次。
访问次序可以分为四种:
- 前序遍历
从根结点出发,当第一次到达结点就输出结点数据,按照先左再右的方向访问
如图:
执行步骤:
从根结点,第一次到达A,输出A
继续向左,到达B,输出B
同样规则输出D、H
当到达叶结点H,返回D,此时已经第二次到达D,不再输出,开始向D右子树访问,不为空,访问到I,输出I
I为叶结点返回D,D的左右子结点访问完毕,返回到B,B右子树不为空,访问到E,输出E,依次类推
最终输出:ABDHIEJCFG
- 中序遍历
从根结点出发,每二次到达结点时就输出结点数据,按照先左后右
最终输出:HDIBJEAFCG
- 后序遍历
从二叉树根结点出发,每三次到达的结点时就输出该结点数据,按照先左后右
最终输出:HIDJEBFGCA
- 层次遍历
按照树的层次自上而下的遍历二叉树
最终输出:ABCDEFGHIJ
二叉树之霍夫曼树
霍夫曼树是二叉树的一种特殊方式,又称最优二叉树,其主要作用在于数据压缩和编码长度的优化。
- 路径和路径长度
路径:从一棵树中,从一个结点往下可以到达孩子或者孙子结点之间的通路叫做路径,通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1
A到D路径长度为2,A到C路径长度为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树为一棵霍夫曼树。
二叉排序树
二叉排序树又称二叉查找树,也称二叉搜索树。
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
- 若左子树不能空,则左子树上所有结点的值均小于或等于它的根结点的值
- 若右子树不能空,则左子树上所有结点的值均大于或等于它的根结点的值
- 左右子树也分别为二叉排序树
例子:
现有序列:61 87 59 47 35 73 51 98 37 93
索引 i = 0,A[i] = 61,结点61作为根结点