第五章 树
一、树
1.定义:n个结点的集合,n=0为空树;是递归的,是一种逻辑结构,同时也是一种分层结构;
- 特点
- 树的根结点没有前驱结点,除了根结点外的所有结点有且只有一个前驱结点;
- 树的所有结点可以有0个或者多个后继结点;
- 树适合于表达具有层次结构的数据;
- 除根结点外,分支结点又叫内部结点。
2.树的术语
- 结点:一个数据元素及其若干指向其子树的分支;如图中有17个结点;
- 结点的度、树的度:结点所拥有的子树棵数称为结点的度;树中结点度的最大值称为树的度;如图中A的度是3、B是2、Q是0;
- 叶子结点:度为0(不为0的是非叶子结点);
- 孩子结点、双亲结点、兄弟结点点、(层次)堂兄弟结点(像族谱);
- 同一双亲结点的所有子结点互称为兄弟结点;
- 同一层次的所有结点互称为堂兄弟结点(其子结点在+1层);
- 结点的层次路径、祖先、子孙
- 层次路径:从根结点到达某结点(例如p点)所经过的所有结点成为结点(p)的层次路径(有且只有一条);
- 结点(p)的层次路径上所有的结点(不包括p)都称为p的祖先;
- 以某结点为根的子树中任意结点都是该根结点的子孙结点。
- 结点的深度:从根结点,自顶向下逐层累加;
- 结点的高度:从叶节点,自底向上逐层累加;
- 有序树和无序树:顾名思义,有序和无序之分;
- 森林:类似于把树的根结点去除,剩下的子树便成了深林。
3.树的性质:
- 树中的结点数等于所有结点的度数和加1;
- 度为m的树中第i层上至多有 mⁱ⁻¹个结点(i≥1);
- 高度为h的m叉树至多有 mʰ-1/m-1个结点,例如二叉树最多为二个分支;
- 具有n个结点的m叉树的最小高度为 logₘ(n(m-1)+1;
二、二叉树
1.定义:另外一种树形结构,每个结点最多只有两棵子树(不存在度大于2的结点),且子树有左右之分,次序不可随意颠倒;二叉树是n个结点的有限集合,n=0为空树;
- 有且只有一个根结点;
- n>1时,其余结点被分为两互不相交的子集,也是递归的;
2.满二叉树:深度为k,且有2ᵏ-1个结点;
- 特点
- 每层都是最大结点数;
- 所有支结点都有左右子树;
- 可以对结点进行编号,自上而下,自左而右。
3.平衡二叉树:树上任意一结点的左子树和右子树的深度之差不超过1。
4.完全二叉树:简单来说,与满二叉树的结构不同就在于,完全二叉树可以不满;也就是说完全二叉树是满二叉树的一部分,而满二叉树是完全二叉树的特例;
- 特点
- 若完全二叉树的深度为k,则所有的叶子结点都出现在第k层或k-1层。对于任一结点,如果其右子树的最大层次为l,则其左子树的最大层次为或l+1;
- 若i<=|n/2|,则结点i为分支结点,否则为叶子结点;
- 叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层的最左边的位置;
- 如果有度为1的结点,只可能有一个,且该结点只有左孩子而无右孩子;
- 按层序编号后,一旦出现某结点(其编号为i)为叶子结点或只有左孩子,则编号大于i的结点均为叶子结点。
5.二叉树的性质
- 在非空二叉树中,第i层上至多有2ⁱ-1个结点(i≧1); 深度为k的二叉树至多有2ᵏ-1个结点(k≧1);
- ▲[mark]对任何一棵二叉树,若其叶子结点数为n₀,度为2的结点数为n₀,则n₀=n₂+1;[/mark]
- n个结点的完全二叉树深度为:(向下取整log₂n)+1或向上取整log₂(n+1);例如3.5向上取整是4,向下取整是3。
6.二叉树的存储
-
顺序存储:完全二叉树和满二叉树比较适合这个方法;
- 最坏情况:深度为k且只有k个结点的单支树需要的长度为2ᵏ-1的一维数组;
-
链式存储
- 二叉链表:三个域:一个数据域,分别指向左右子结点的指针域;
- 三叉链表:在二叉链表基础上再加一个指针域,用来指向结点的父结点;
7.遍历二叉树:按一定规律对二叉树每个结点访问一次且仅访问一次;
- 方法▲
- DLR——先(根)序遍历:根左右,时间复杂度O(n);
- LDR——中(根)序遍历:左根右,时间复杂度O(n);
- LRD——后(根)序遍历:左右根,时间复杂度O(n);
- 层次遍历:需要借助一个队列:自上而下,从左到右。
三、树与森林
1.树的存储结构
- 双亲表示法(顺序存储结构):在每个结点中附加一个指示器(整数域);
- 孩子链表表示法:每个结点有多个指针域,每个指针指向其一棵子树的根结点;
2.森林与二叉树的转换 - 树转成二叉树
- 步骤:
- 加虚线:兄弟间加虚线;
- 去连线:除最左的第一个结点外的父结点与其点的连线全部去掉;
- 旋转:顺时针旋转45°,原有的实线左斜;
- 整型:将旋转后树中的虚线改为实线并向右斜。
- 特点:无右子树,只有左子树。
- 步骤:
- 二叉树转成树
- 步骤
- 加虚线:若某结点i是其父结点的左子树的根结点,则将该结点i的右子结点以及沿右子链不断地搜索所有的右子结点,将所有这些右子结点与i结点的父结点之间加虚线相连;
- 去连线:去掉二叉树中所有父结点与其右子结点之间的连线;
- 规整化。将各结点按层次排列且将所有的虚线变成实线。
- 步骤
- 森林转二叉树:相当于树转二叉树;
- 二叉树转森林:相当于二叉树转树;
3.树和森林的遍历(看树和森林的遍历与二叉树遍历的关系就懂了);
四、树的应用(赫夫曼树、最优树)
1.基本概念:是一类带权路径长度最短的树;
- 结点路径:树中结点到结点的路径;
- 路径长度:看有多少个分支;
- 树的路径长度:树根到每个结点的和;
结点的带权路径长度:权值乘以从该结点到树根结点之间的路径长度;
树的带权路径长度:树中所有叶子结点的带权路径的长度之和。
2.哈夫曼树算WPL值
3.哈夫曼树的构造(最优树)
4.哈夫曼编码(Huffman)
- 特点:编码要尽可能短,长短不等,任意字符的编码不是另一个编码的前缀(前缀编码);
5.例题:一棵度为2的树与一棵二叉树有什么区别?
答案:
1、度为2的树是不区分左子树和右子树.而二叉树是要分左子树和右子树的;
2、度为2的数不包含空树,而二叉树是可以有空树的;总之,二叉树的定义要比度为2的树定义更为严格,更为详细。