第五章 树与二叉树

本文详细介绍了二叉树的基本性质、完全二叉树和满二叉树的特点,以及二叉树的存储结构和遍历方法,包括先序、中序、后序和线索化。此外,还讨论了哈夫曼树的构建和编码,以及树和森林的存储方式和转换规则。

1. 二叉树

1.1 二叉树的性质

二叉树最基本的3条性质。不论是普通的二叉树还是完全二叉树,都满足以下三条。

  1. iii 层上最多有 2i−12^{i-1}2i1 个结点。

  2. 高度(深度)为 hhh 的二叉树,最多共有 2h−12^{h}-12h1 个结点。
    推导:1+2+⋯+2h−1=2h−11+2+\cdots+2^{h-1}=2^{h}-11+2++2h1=2h1. 等比数列求和:a1(1−qn)1−q\dfrac{a_{1}(1-q^{n})}{1-q}1qa1(1qn)
    推论:高度(深度)为 hhh 的 k 叉树,最多共有 1+k+⋯+kh−1=kn−1k−11+k+\cdots+k^{h-1} =\dfrac{k^{n}-1}{k-1}1+k++kh1=k1kn1 个结点

  3. n0=n2+1n_{0}=n_{2}+1n0=n2+1
    推导:设二叉树总的结点个数为nnn,则 n=n0+n1+n2n= n_{0}+n_{1}+n_{2}n=n0+n1+n2.
    又除根节点外,每个结点头上都有一个分支,则结点总数 n=n=n=分支数+1+1+1,分支数 =0⋅n0+1⋅n1+2⋅n2= 0\cdot n_{0}+1\cdot n_{1}+2\cdot n_{2}=0n0+1n1+2n2 ,即 n=n1+2n2+1n=n_{1}+2 n_{2}+1n=n1+2n2+1.
    由以上两式,得 n0+n1+n2=n1+2n2+1n_{0}+n_{1}+n_{2}=n_{1}+2 n_{2}+1n0+n1+n2=n1+2n2+1,即 n0=n2+1n_{0}=n_{2}+1n0=n2+1.

1.2 两种特殊的二叉树

1.2.1 完全二叉树

完全二叉树的结点从上往下,从左往右,依次排列。
下图为完全二叉树:
在这里插入图片描述
下面两棵树不是完全二叉树:
在这里插入图片描述
由完全二叉树的定义可以推导出它的性质:

  1. nnn个结点的完全二叉树的高数(深度)h=⌊log⁡2n⌋+1h=\lfloor \log_2n \rfloor+1h=log2n+1h=⌈log⁡2(n+1)⌉h=\lceil \log_2(n+1) \rceilh=log2(n+1)⌉
    推导:2k−1−1<n≤2k−12^{k-1}-1<n\leq 2^{k}-12k11<n2k1
  2. iii 个结点如果有左孩子,则左孩子编号为 2i2i2i
    iii 个结点如果有右孩子,则左孩子编号为 2i+12i+12i+1
  3. iii 为偶数时,第 iii 个结点的双亲结点的编号为 i2\dfrac{i}{2}2i;
    iii 为奇数时,第 iii 个结点的双亲结点的编号为 i−12\dfrac{i-1}{2}2i1;
    综上,第 iii 个结点的双亲结点编号为⌊i2⌋\lfloor \dfrac{i}{2} \rfloor2i;

1.2.2 满二叉树

高度为 hhh 的二叉树的结点数为 2h−12^{h}-12h1
在这里插入图片描述

1.3 二叉树的存储结构

  1. 顺序存储
    在这里插入图片描述

  2. 链式存储
    在这里插入图片描述
    若用静态链表存储该二叉树,则为:
    在这里插入图片描述

掌握 给定存储结构能画出二叉树。




2. 二叉树的遍历和线索化

2.1 二叉树的遍历

  1. 二叉树的四种遍历
    在这里插入图片描述
    先序(根左右):- + a * b - c d / e f
    中序(左根右):a + b * c - d - e / f
    后序(左右根):a b c d - * + e f / -
    对应的分别是 前缀表达式,中缀表达式,后缀表达式。
    层序:- + / a * e f b - c d,层序遍历需要借助队列

  1. 由遍历序列确定二叉树
    中序 + 前序 / 后序 可以确定一棵二叉树。
    (1)先序+中序
    在这里插入图片描述
    在这里插入图片描述
    (2)中序+后序
    在这里插入图片描述
    在这里插入图片描述

  1. 两种遍历序列相同的特殊二叉树
    在这里插入图片描述
    在这里插入图片描述

2.2 二叉树的线索化

线索二叉树的结点结构:
在这里插入图片描述
二叉树的每个结点都有两个指针(lchild,rchild),若结点有左右孩子,则左右指针分别指向左右孩子;若没有左(右)孩子,可以将左(右)指针指向 前序(后继)结点,方便查找前驱(后继)。
为了区别指针指的是左右孩子还是前驱后继,增加两个标志域 ltag 和 rtag 用于区分。
在这里插入图片描述
等于 0 说明指向孩子,等于 1 的说明指向前驱 / 后继。

将每个结点的空指针指向结点的前驱 / 后继的过程叫做二叉树的线索化。
三种不同的遍历产生三种不同的序列,结点在不同遍历序列中的前驱后继不同。因此,依据遍历序列的不同将线索化分为三种:先序线索化,中序线索化,后序线索化。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述




3. 哈夫曼树

3.1 度为2的哈夫曼树(最优二叉树)

哈夫曼树中权值越大的结点越靠上(重要的结点更容易找到),权值越小的结点越靠下。结点的孩子可以相互交换,不影响带权路径长度,因此哈夫曼树不唯一

度为 2 的哈夫曼满足二叉树的性质。

哈夫曼树带权路径最小,且唯一。

哈夫曼树(度为2)只有度为 0 和度为2的结点,即 n1=0n1=0n1=0

含字符的结点在哈夫曼树中都是叶子结点。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


3.2 哈夫曼编码

哈夫曼编码是前缀编码,前缀编码没有前缀。例如:
在这里插入图片描述
B 中 0 是 00 的前缀,1 是 11 的前缀,不是前缀编码;A,C,D是前缀编码。

哈夫曼编码按照哈夫曼树进行构造,规则是 “左0右 1”。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


3.3 度为 m 的哈夫曼树(最优m叉树)

度为 m 的哈夫曼树在构造时,
对于 mmm 个权值,建 kkk 叉树,若 (m−1)%(k−1)=0(m-1)\%(k-1)=0(m1)%(k1)=0,则第一次合并时将 kkk 个权值进行合并;
(m−1)%(k−1)≠0(m-1)\%(k-1)\neq0(m1)%(k1)=0,则第一次合并时将 (m−1)%(k−1)+1(m-1)\%(k-1)+1(m1)%(k1)+1 个权值进行合并。
在这里插入图片描述




4. 树和森林

树的存储有顺序存储结构和链式存储结构。
顺序存储结构:双亲表示法;
链式存储结构:孩子表示法,孩子兄弟表示法;

4.1 树的存储结构

  1. 双亲表示法
    用数组存储每个结点,和其双亲结点在数组中的下标。
    在这里插入图片描述

  2. 孩子表示法
    将每个结点及其孩子结点用单链表链接起来。n 个结点就有 n 个孩子链表。
    在这里插入图片描述

  3. 孩子兄弟表示法
    孩子兄弟表示法 又称 二叉树表示法,用二叉链表存储树。每个结点有三部分:结点值,指向第一个孩子结点的指针,指向下一个兄弟结点的指针,简称为 “左孩子,右兄弟”。
    在这里插入图片描述


4.2 树 / 森林与二叉树的转换

规则:“左孩子,右兄弟”。
在这里插入图片描述


4.3 树的的遍历

在这里插入图片描述
树的后根遍历对应二叉树的中序遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值