[总结]数据结构真是博大精深(二)

数据结构学习提纲

(最终解释权归原作者所有,侵权必究)

树和二叉树

1、【概念】树的定义和基本术语

树是一种递归的数据结构,树中包含树。树由根节点和子树组成。

结点:叶子(终端结点)、根、内部结点(非终端结点、分支结点)

树的规模:结点的度、树的度、结点的层次、树的高度(深度)

结点间的关系:双亲(1)-孩子(n)、祖先-子孙、兄弟、堂兄弟

兄弟间的关系:有序树、无序树  森林

2、【概念】树的表示

结点连线表示、二元组表示、集合图表示、凹入表示

3、【概念】二叉树

① 二叉树或为空树,或是由一个根节点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。二叉树与树是两种不同的树结构,前者有序,后者无序。每个结点至多只有两棵子树,子树有左右之分,其次序不能任意颠倒。

② 特殊的二叉树:满二叉树、完全二叉树、理想平衡树

③ 二叉树的性质:在二叉树的第i层上至多有2^i-1个结点;一棵深度为k的二叉树中,最多具有2^k-1个结点;对于一棵非空的二叉树,如果叶子结点数为n0,度数为2的结点数为n2,则有n0=n2+1;具有n个结点的完全二叉树的深度k=[log2n]+1

4、【概念】二叉树的存储结构

顺序存储结构:按从上至下和从左至右的顺序将二叉树中的结点按顺序存储在一维数组中,注意如不是完全二叉树,要增添一些并不存在的空结点,使之成为一棵完全二叉树的形式。适用于完全二叉树或形态接近于完全二叉树的二叉树。

二叉链表存储结构:每个结点由三个域组成,数据域和两个指针域,分别指向左孩子结点和右孩子结点。性质:在含有n个结点的二叉链表中有n+1个空指针域。方便找孩子,不方便找双亲。

三叉链表存储结构:在二叉链表基础上加一个指向双亲的指针。

5、【实践】二叉树的基本操作

先序遍历(递归)、中序遍历(递归)、后序遍历(递归)□基于任务分析的二叉树遍历算法的非递归实现(前序遍历、中序遍历、后序遍历)□ 基于搜索路径分析的二叉树遍历算法的非递归实现 □ 层次遍历 □ 递归创建二叉树的二叉链表存储结构□ 读入边创建二叉链表的非递归算法 □ 由二叉树的遍历序列确定二叉树 □ 由原表达式创建表达式二叉链表 □ 求二叉树的深度 □ 求二叉树的叶子结点数 □ 求二叉树任意结点的祖先□ 以凹入表的形式显示二叉树 □ 基于表达式二叉树的动态表达式计算 □

6、【概念】线索二叉树

线索二叉树的定义:利用二叉树的二叉链表存储结构中的空指针域来指示结点的直接前驱结点和直接后继结点,指向的指针称为线索,加了线索的二叉树称为线索二叉树。

⑵一个具有n个结点的二叉树,2n个指针域中只有n-1个指针域用来存储孩子结点的地址,另外n+1个指针域存放的都是NULL。因此,可以利用某结点空的左指针域(lchild)存放该结点在某种遍历序列中的直接前驱结点的存储地址,利用结点空的右指针域(rchild)存放该结点在某种遍历序列中的直接后继结点的存储地址,对于那些非空的指针域,则仍然存放指向左、右孩子的指针。由于遍历序列可由不同的遍历方法得到,因此,线索二叉树有先序线索二叉树、中序线索二叉树和后序线索二叉树三种,把二叉树的n+1个空指针域置为线索的过程称为线索化

⑶ 为了区别某结点的指针域内存放的是指针还是线索,为每个结点增设两个标志位域ltag和rtag,若为0,则对应为指针,为1,对应为线索。结点的结构为:

lchild

ltag

data

rtag

rchild

⑷ 为了将二叉树中所有空指针域都利用上,并方便判断遍历操作何时结束,在存储线索二叉树时增设一个头结点,其结构与其他线索二叉树的结点结构一样,只是其数据域不存信息。初始化使其左指针域指向二叉树的根节点,右指针域指向自己。线索化完成后,让头结点的右指针域指向某序遍历下的最后一个结点。而原二叉树在某序遍历下的第一个结点的前驱线索和最后一个结点的后续线索都指向该头结点

7、【实践】线索二叉树的基本操作

建立一棵中序线索二叉树 □ 在中序线索二叉树上查找任意结点的中序前驱结点□ 在中序线索二叉树上查找任意结点的中序后继结点 □ 在中序线索二叉树上查找任意结点在先序下的后继 □ 在中序线索二叉树上查找任意结点在后序下的前驱 □ 在中序线索二叉树上查找值为x的结点 □ 在中序线索二叉树上的更新 □ 基于中序二叉树的遍历 □

8、【概念】树、森林与二叉树的转换

树转换为二叉树:树的兄弟关系对应二叉树的双亲和右孩子的关系;树的双亲和长子关系对应二叉树的双亲和左孩子的关系。

 规则:加线(树的所有相邻兄弟之间加一条连线)à 去线(对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其他孩子结点之间的连线)à 层次调整(以根节点为轴心,将树顺时针转动一定的角度,使之层次分明)

⑵森林转换为二叉树:将森林中的每棵树转换为二叉树,将第i+1棵树作为第i棵树的右子树,依次连接成一棵二叉树。

9、【概念】树的存储结构

双亲表示法(顺序存储):方便找双亲,不易查找孩子。

孩子链表表示法(链式存储):方便找孩子,不易查找双亲

双亲孩子表示法

孩子兄弟链表表示法

10、【实践】树的相关操作

创建孩子链表 □ 创建孩子兄弟链表 □ 树的先根遍历(等价于二叉树的先序遍历)□ 树的后根遍历(等价于二叉树的中序遍历) □ 树的层次遍历 □ 森林的先序遍历(等价于二叉树的先序遍历)□ 森林的中序遍历(等价于二叉树的中序遍历)□ 树的结点查找□ 树的结点插入 □ 树的结点删除 □ 树的深度 □ 树的凹入表显示 □ 二叉树中所有叶子结点的路径 □ 树中所有叶子结点的路径 □

11、【概念】哈夫曼树及基本概念

最优二叉树哈夫曼树,指对于一组带有确定权值的叶结点,构造的具有最小带权路径长度的二叉树。

⑵ 结点间的路径长度:两个结点之间的分支数。

     结点的权值:附加在结点上的信息。

    结点带权路径:结点上权值与该结点到根之间的路径长度的乘积。

    二叉树的带权路径长度WPL(Weight Path Length):二叉树中所有叶子结点的带权路径长度之和。

⑶ 给定一组具有确定权值的叶子结点,可以构造出不同的带权二叉树。根据哈夫曼树的定义,一棵二叉树要使其WPL值最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶结点越远离根结点。

⑷ 特点:权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点;只有度为0和度为2的结点,不存在度为1的结点;有n个叶子结点的哈夫曼树中有m=2n-1个结点。

⑸ 应用:能够解决某些判定问题时的最佳判定算法,如使分支结构程序执行效率提高等。

12、【概念】构建哈夫曼树的主要步骤

⑴ n个权值{w1,w2,…,wn}构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵二叉树Ti只有一个带权为Wi的根结点,其左右子树均为空。

⑵ 在F中选两棵根结点的权值最小的树作为左右子树构成一棵新的二叉树,且根结点的权值为其左右子树根结点的权值之和。

⑶ 在F中删除这两棵树,同时将新的二叉树加入F。

⑷ 重复⑵和⑶,直到F只含一棵树为止。

13、【概念】哈夫曼编码

哈夫曼编码是根据哈夫曼树构造的二进制编码,用于网络通信中,作为一种最常用的无损压缩编码方法,在数据压缩程序中具有非常重要的应用。

在传送信息时,如果对每个字符进行不等长度的编码,使出现频率高的字符编码尽量短,这样会使传送的总长度变短,从而提高信息的传输效率。为了保证译码的唯一性,设计的不等长编码,必须满足任一字符的编码都不是另一个字符编码的前缀,这种编码称为前缀编码。利用哈夫曼树可以得到不等长的二进制形式的前缀编码。在根到叶子的路径中规定左分支为0,右分支为1,就可以得到每个叶子结点的编码。

14、【概念】哈夫曼树的存储结构

huffman树用静态三叉链表做存储结构,且0号单元不用。huffman编码用指向字符的指针数组来动态管理存储,且0号单元不用。

#define N 字符数目

#define M 结点数目

typedefstruct { char data; int weight; int parent,lch,rch}NodeType; //huffman树结点类型

typedefNodeType HufTree[M+1]; //静态三叉链表存储huffman树

typedef char** HufCode; //动态分配指针数组存储huffman编码

15、【实践】哈夫曼树及哈夫曼编码相关

已知n个字符的权值,生成一棵huffman树 □ 求叶子结点的哈夫曼编码 □

16、【实践】相关算法设计题

⑴ 判定给定二叉树是否为完全二叉树 □

⑵ 编写复制二叉树的算法 □

⑶ 设一棵二叉树的结点结构为(LChild,data,RChild),root为指向该二叉树根结点的指针,p和q分别为指向该二叉树中任意两个结点的指针,试编写一算法ancestor(root,p,q,r),该算法找到p和q的最近共同祖先结点r。□

⑷ 分别以孩子兄弟链表和双亲表示法作为树的存储结构,编写求树的高度的算法。□

⑸ 创建先序线索二叉树,并在其上查找给定结点*p在先序序列中的后继。

⑹ 假设以二叉链表存储的二叉树中,每个结点所含数据元素均为单字母,试编写算法,按树状打印二叉树的算法。□

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值