数据结构 树和二叉树

逻辑结构

定义

nn≥0)个结点的有限集合(当n=0时,称为空树)

任意一棵非空树满足以下条件:

有且仅有一个特定的称为根的结点

n>1时,除根结点之外的其余结点被分成mm>0)个互不相交的有限集合T1,T2,… ,Tm,       其中每个集合又是一棵树,并称为这个根结点的子树

基本术语

结点的度:结点所拥有的子树的个数

树的度:树中各结点度的最大值

叶子结点:度为0的结点,也称为终端结点

分支结点:度不为0的结点,也称为非终端结点

孩子和双亲:树中某结点子树的根结点称为这个结点的孩子结点,

                     这个结点称为它孩子结点的双亲结点

兄弟:具有同一个双亲的孩子结点互称为兄弟

路径:如果树的结点序列n1, n2, …,  nk有如下关系:

           结点nini+1的双亲(1<=i<k),则把n1, n2, …, nk称为一条由n1至nk的路径

           路径上经过的边的个数称为路径长度。

祖先和子孙:在树中,若有一条路径从结点x到结点y,那么x就称为y的祖先,而y称为x的子孙。

结点所在层数:根结点的层数为1

                         对其余任何结点,若某结点在第k层,则其孩子结点在第k+1层

树的深度:树中所有结点的最大层数,也称高度

层序编号:将树中结点按照从上到下、同层从左到右的次序依次给他们编以从1开始的连续自然数

有序树和无序树:如果一棵树中结点的各子树从左到右是有次序的,称这棵树为有序树

                             反之,称为无序树

 森林:m (m≥0)棵互不相交的树的集合

同构:对两棵树,若通过对结点适当地重命名,就可以使这两棵树完全相等

        (结点对应相等,结点对应关系也相等),则称这两棵树同构

遍历操作:从根结点出发,按某种次序访问树中所有结点,使每个结点被访问一次且仅被访问一次

三种遍历操作:

1.树的前序遍历操作定义为:

   若树为空,则空操作返回;

   否则   ⑴ 访问根结点

             ⑵ 按照从左到右的顺序前序遍历根结点的每一棵子树

2.树的后序遍历操作定义为:

   若树为空,则空操作返回;

   否则   ⑴ 按照从左到右的顺序后序遍历根结点的每一棵子树

             ⑵ 访问根结点

3.树的层序遍历操作定义为:

   从树的第一层(即根结点)开始,自上而下逐层遍历

   在同一层中,按从左到右的顺序对结点逐个访问

存储结构

双亲表示法(静态链表)

孩子表示法

  多重链表表示法 

法一:

法二:

孩子链表表示法

      基本思想:把每个结点的孩子排列起来,构成线性表,且以单链表存储,则n个结点共有 n 个孩子链表。这 n 个单链表共有 n 个头指针,这 n 个头指针又组成了一个线性表,为了便于进行查找采用顺序存储

     最后,将存放 n 个头指针的数组和存放n个结点的数组结合起来,构成孩子链表的表头数组  

双亲孩子表示法

孩子兄弟表示法

二叉树

逻辑结构

定义

二叉树是nn≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成

特点

⑴ 每个结点最多有两棵子树

⑵ 二叉树是有序的,其次序不能任意颠倒

注:二叉树和树是两种树结构

特殊二叉树

斜树

1 .所有结点都只有左子树的二叉树称为左斜树

2 .所有结点都只有右子树的二叉树称为右斜树

3.左斜树和右斜树统称为斜树

特点

1. 在斜树中,每一层只有一个结点

2.斜树的结点个数与其深度相同

满二叉树

在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层

特点

1. 叶子只能出现在最下一层

2.只有度为0和度为2的结点

满二叉树在同样深度的二叉树中结点个数最多

满二叉树在同样深度的二叉树中叶子结点个数最多

完全二叉树 

对一棵具有n个结点的二叉树按层序编号,如果编号为i(1≤in)的结点与同样深度的满二叉树中编号为的结点在二叉树中的位置完全相同

 在满二叉树中,从最后一个结点开始,连续去掉任意个结点,即是一棵完全二叉树

特点

1.  叶子结点只能出现在最下两层,且最下层的叶子结点都集中在二叉树的左部

2.  完全二叉树中如果有度为1的结点,只可能有一个,且该结点只有左孩子

 3.  深度为k的完全二叉树在k-1层上一定是二叉树

基本性质

1.二叉树的第 层上最多有2^{i-1}个结点(i\geqslant 1 

证:当 i=1 时,第1层只有一个根结点,而 2^{i-1}=2^{0}=1,结论显然成立。

       假定 i=k(1≤k<i)时结论成立,即第k层上至多有 2^{k-1} 个结点

       则 i=k+1 时,因为第k+1层上的结点是第k层上结点的孩子

       而二叉树中每个结点最多有2个孩子

       故在第 k+1 层上,最大结点个数为第k层上的最大结点个数的 2 倍,即 2\times 2^{k-1}= 2^{k}

       结论成立

2. 一棵深度为k的二叉树中,最多有2k-1个结点,最少有k个结点

证:由性质1可知,深度为k的二叉树中结点个数最多 = =2^{k}-1

       每一层至少要有一个结点,因此深度为k的二叉树,至少有k个结点。

深度为k且具有2k-1个结点的二叉树一定是满二叉树,

深度为k且具有k个结点的二叉树不一定是斜树。

3. 在一棵二叉树中,如果叶子结点数为n_{0 },度为2的结点数为n_{2},则有: n_{0}=n_{2}+1

证: 设n为二叉树的结点总数,n1为二叉树中度为1的结点数

      则有:   n = n_{0}+n_{1}+n_{2}

      在二叉树中,除了根结点外,其余结点都有唯一的一个分枝进入

     由于这些分枝是由度为1和度为2的结点射出的 

     一个度为1的结点射出一个分枝,一个度为2的结点射出两个分枝

    所以有: n = n_{1}+2n_{2}+1

    因此可以得到:n_{0}=n_{2}+1

4.具有n个结点的完全二叉树的深度为 log_{2}n+1

证:设具有n个结点的完全二叉树的深度为k,根据完全二叉树的定义和性质2,有下式成立:

        

5. 对一棵具有n个结点的完全二叉树中,从1开始按层序编号,则对于任意的序号为i(1≤in的结点(简称为结点i), 有:

                                      (1)若 i>1,则结点i 的双亲结点的序号为 i/2

                                          若i=1,则结点i是根结点,无双亲结点

                                      (2)若2in,则结点 i 的左孩子为2i , 否则结点 无左孩子

                                      (3)若2i+1≤n,则结点i的右孩子为2i+1;否则结点 无右孩子

证:利用数学归纳法证明这个性质。首先证明(2)和(3)

当i=1时,若n≥3,则根的左、右孩子的编号分别是2,3;若n<3,则根没有右孩子;

若n<2,则根将没有左、右孩子 , 以上对于(2)和(3)均成立

假设:对于所有的1≤j≤i 结论成立。即:结点j的左孩子编号为2j;右孩子编号为2j+1。

由完全二叉树的结构可以看出:结点i+1或与结点i同层且紧邻i结点的右侧,

                                                   或i位于某层的最右端,i+1位于下一层的最左端。

可以看出,i+1的左、右孩子紧邻在结点i的孩子后面,

由于结点i 的左、右孩子编号分别为 2i 和 2i+1

所以,结点 i+1 的左、右孩子编号分别为 2i+2 和2i+3

即结点i+1的左孩子编号为:2(i+1),右孩子编号为2(i+1)+1

又因为二叉树由n个结点组成,所以,

当2(i+1)+1>n,且2(i+1)=n时,结点i+1只有左孩子,没有右孩子;

当2(i+1)>n,结点i+1既无左孩子也无右孩子。

以上证明得到(2)和(3)成立。

下面利用上面的结论证明(1)

对于任意一个结点i,若2i≤n,则左孩子的编号为2i,反过来结点2i的双亲就是i,

而 2i/2=i;若2i+1≤n,则右孩子的编号为2i+1,反过来结点2i+1的双亲就是i,

而 (2i+1)/2 =i,由此可以得出(1)成立

 遍历操作

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

次序:前序遍历、中序遍历、后序遍历、层序遍历

如果限定先左后右,则二叉树遍历方式有三种:

                                                                          前序:DLR

                                                                          中序:LDR

                                                                          后序:LRD

层序遍历:按二叉树的层序编号的次序访问各结点

例:已知一棵二叉树的前序(或中序,或后序,或层序)序列,不能确定这棵二叉树唯一

       已知一棵二叉树的前序序列和后序序列,不能确定这棵二叉树唯一

       已知一棵二叉树的前序序列和中序序列,能确定这棵二叉树唯一

        如:已知一棵二叉树的前序和中序遍历序列分别为ABCDEFGHI 和BCAEDGHFI,

               如何构造该二叉树?

1、

2、

3、

4、

 根据前序确定根结点、根据中序确定左右子树

 二叉树的顺序存储结构一般仅存储完全二叉树

 具有n个结点的二叉链表中,有2n -(n-1)= n+1个空指针。

三叉表

在二叉链表的基础上增加了一个指向双亲的指针域

线索:将二叉链表中的空指针域指向前驱结点和后继结点的指针被称为线索

线索化:使二叉链表中结点的空链域存放其前驱或后继信息的过程称为线索化

线索二叉树:加上线索的二叉树称为线索二叉树(遍历:前序、中序、后序、层次)

树、森林、二叉树的转换

树和二叉树之间具有对应关系。二叉树链表存储与树的孩子兄弟存储。

树与二叉树对应关系(物理结构)

树转换为二叉树

⑴加线——树中所有相邻兄弟之间加一条连线

⑵去线——对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其它孩子结点                     之间的连线

⑶调整层次——以根结点为轴心,将树顺时针转动一定的角度,使之层次分明

树的前序遍历等价于二叉树的前序遍历

树的后序遍历等价于二叉树的中序遍历

      

森林转为二叉树

⑴ 将森林中的每棵树转换成二叉树

⑵ 从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所        有二叉树连起来后,此时所得到的二叉树就是由森林转换得到的二叉树。

二叉树转换为树或森林

⑴ 加线——若某结点x是其双亲y的左孩子,则把结点x的右孩子、右孩子的右孩子、……,                               都与结点y用线连起来;

⑵ 去线——删去原二叉树中所有的双亲结点与原本右孩子结点的连线

层次调整——整理由⑴、⑵两步所得到的树或森林,使之层次分明。

森林有两种遍历方法:

⑴前序遍历:前序遍历森林中的每一棵树

⑵后序遍历:后序遍历森林中的每一棵树

哈夫曼树

哈夫曼树:给定一组具有确定权值的叶子结点,带权路径长度最小的二叉树。

特点:1. 权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点

           2. 只有度为0和度为2的结点,不存在度为1的结点

叶结点的权值:对叶结点赋予的一个有意义的数值

二叉树的带权路径长度(WPL):设二叉树具有n个带权值的叶结点,从根结点到各个叶子结点的                                                         路径长度与相应叶子结点权值的乘积之和。 

哈夫曼前缀编码:一组编码中任一编码都不是其它任何一个编码的前缀 

                             前缀编码保证了在解码时不会有多种可能

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值