- 22
- 0
- 约4.93万字
- 约 31页
- 2016-10-12 发布于贵州
- 举报
数据结构习题解第6章
第6章 树与森林
一、复习要点
本章主要介绍了树与森林、二叉树的定义、性质、操作和相关算法的实现。特别是二叉树的遍历算法,它们与许多以此为基础的递归算法都必须认真学习。因为树的先根遍历次序与对应二叉树表示的前序遍历次序一致,树的后根遍历次序与对应二叉树的中序遍历次序一致,因此可以据此得出树的遍历算法。线索化二叉树是直接利用二叉链表的空链指针记入前驱和后继线索,从而简化二叉树的遍历。堆是一种二叉树的应用,可以用它作为优先级队列的实现。它的存储表示是完全二叉树的顺序存储方式,它的定义不要求堆中的数据有序,但要求双亲结点与子女结点必须满足某种关系。本章最后讨论霍夫曼树。这种树是扩充二叉树,要求在外结点上带有权值,在构造霍夫曼树时必须注意一个新结点的左子女上所带的权值小于右子女上所带的权值,这不是霍夫曼树必须这样,而是实现算法造成这种结果。此外,作为霍夫曼树的应用,引入霍夫曼编码。通常让霍夫曼树的左分支代表编码“0”,右分支代表编码“1”,得到霍夫曼编码。这是一种不等长编码,可以有效地实现数据压缩。
本章复习的要点是:
1、基本知识点
要求理解树和森林的定义,树的抽象数据类型,二叉树的定义,二叉树的性质,二叉树的抽象数据类型,二叉树的数组表示和链表存储表示。要求掌握二叉树的遍历,包括中序遍历、前序遍历、后序遍历方法,要求理解二叉树的计数方法及从二叉树遍历结果得到二叉树的方法。对于线索化二叉树,要求理解什么是线索,中序线索化二叉树的结构特性及寻找某结点的前驱和后继的方法。此外,需要理解堆的定义及其实现的方法,本章只考虑用完全二叉树的顺序存储来实现。还需要理解堆的建立,插入与删除过程。要求掌握树/森林与二叉树的转换,树的遍历方法。最后要求掌握霍夫曼树的实现方法及霍夫曼编码的概念。
2、算法设计
( 建立二叉树的递归算法。
( 前序、中序、后序遍历二叉树的递归算法。
( 使用栈的前序、中序、后序遍历的非递归算法。
( 统计二叉树结点个数,二叉树叶结点个数,二叉树高度的递归算法。
( 自左向右链接二叉树叶结点的递归算法。
( 判断两棵二叉树相等和交换二叉树左、右子女指针的递归算法。
( 通过二叉树的遍历建立前序线索化二叉树和中序线索化二叉树的算法。
( 中序线索化二叉树上的中序遍历算法。
( 前序线索化二叉树上的前序遍历算法。
( 后序线索化二叉树上的后序遍历算法。
( 利用堆实现优先级队列的操作。
( 堆的自上向下和自下向上的调整算法。
( 堆的插入与删除算法。
( 树的先根、后根、层次遍历算法(基于树的二叉树表示)。
二、难点与重点
1、树:树的定义、树的基本运算
树的分层定义是递归的
树中结点个数与高度的关系
2、二叉树:二叉树定义、二叉树的基本运算
二叉树性质、二叉树中结点个数与高度的关系、不同种类的二叉树棵数
完全二叉树的顺序存储、完全二叉树的双亲、子女和兄弟的位置
二叉树的前序·中序·后序遍历的递归算法和使用栈的非递归算法
二叉树的层次遍历算法
中序线索化二叉树、前驱与后继的查找方法、建立中序线索化二叉树的算法
3、霍夫曼树:霍夫曼树的构造方法、霍夫曼编码、带权路径长度的计算
霍夫曼树是带权路径长度最小的扩充二叉树
构造霍夫曼树时,按构造算法,每次具最小关键码的子树是根的左子树,具次小关键码的子树是根的右子树
在构造过程中,新二叉树按根的权值加入到森林的最后
4、树与森林
树的广义表表示、树的双亲表示、树的左子女-右兄弟表示
树、森林与二叉树的对应关系
树的先根·后根·层次遍历算法
5、堆:堆的定义、堆的插入与删除算法
形成堆时用到的向下调整算法
形成堆时的调整过程及比较次数的上界估计
堆插入时用到的向上调整算法
三、教材中习题的解析
6-1 写出用广义表表示法表示的树的类声明,并给出如下成员函数的实现:
(1) operator ( ) 接收用广义表表示的树作为输入,建立广义表的存储表示;
(2) 复制构造函数 用另一棵表示为广义表的树初始化一棵树;
(3) operator == ( ) 测试用广义表表示的两棵树是否相等;
(4) operator ( ) 用广义表的形式输出一棵树;
(5) 析构函数 清除一棵用广义表表示的树。
【解答】
#include iostream.h
#define maxSubTreeNum 20; //最大子树(子表)个数
class GenTree; //GenTree类的前视声明
class GenTreeNode { //广义树结点类的声明
friend class GenTree;
private:
int utype; //结点标志:=0, 数据; =1, 子女
原创力文档

文档评论(0)