三、树与二叉树

课程是中国大学MOOC浙江大学出的数据结构。
作为一个数据结构爱好者,我觉得很有必要稍微整理下各章节的笔记,对知识进行梳理。
查找
首先,老师从“查找”入手,查找分为静态和动态,演示了静态查找的例程,并介绍了‘建立哨兵’的思想。而这个例程使用的是普通的顺序查找,因为其低效性,我们又引入了二分查找(Binary Search)
二分查找
条件有二:①本身是有序的②在数组里实现。他的时间复杂度比顺序查找缩短了不少。读者们可以自己算一下~然后,从二分查找引出了二分查找判定树,层次即为最坏情况比较次数[log2n]+1,ASL平均成功查找次数。
成功过渡到树,终于进入了主题。容易混淆的几个概念,结点的度,树的度,叶节点,树的深度,其他都还好。概念介绍完,怎么实现树呢?数组?对任意的树结构来说,难度太大,我们往往用链表来存储。随之而来的,有2个问题:①结点类型不统一,②若强行使之统一,则会造成较多浪费。解决办法:提出儿子-兄弟表示法。其优点便是是结构统一,但造成的浪费较少,可以计算浪费为2N-(N-1),其中N-1是N个结点固定的边数。有趣的是,我们把儿子-兄弟表示树旋转45°,便得到一个度为2的二叉树,接下来进入到二叉树的部分。
二叉树
度为2,但是有左右之分。它有五种基本形态,并介绍了三种特殊二叉树:斜二叉树、完美(满)二叉树、完全二叉树。二叉树第i层最多2exp{i-1}个节点,深度为k的二叉树最多2exp{k}-1个结点。记叶结点为N0,两个儿子的结点为N2,他们满足个关系式:N0=N2+1,可自证。
二叉树的操作
判空、遍历、创建等。其中遍历尤其重要,后面介绍了4种遍历方法;前中后序+层次遍历。
顺序存储结构
二叉树不同于树,他的存储结构可以用数组存放,即顺序存储结构的实现。但一般针对于完全二叉树,普通二叉树则会造成大量空间浪费。遍历过程中,完全二叉树非跟结点的父结点为下取整i/2,任意结点的左儿子是2i,因此可以快速访问任意结点。
链表存储方法
除了一个data位置存放数据,分为两个指针,分别指向左右子树。
三种递归遍历方法
的具体程序编写。总结为:路径实际上都相同,每个结点都访问了三次,只是访问各结点的实际不同。最后讲了遍历的非递归的算法,实际上是用堆栈来实现递归操作,以中序非遍历来实现是最简单的,稍微改动便能改为先序,而后序则难了许多,需要课外去思考下。
第四种遍历算法
层次遍历。二叉树的遍历实际上是数据从二维到一维的转化。前面通过用堆栈(先保存自己)实现了这个转化,下面我们用队列(先保存左右儿子)也可实现,而队列实现的遍历结果,我们称之为层次遍历。主要步骤:①根结点入队;②结点出队,并访问;③出队结点的左右儿子入队。然后循环②③步骤便能实现二叉树的遍历。
二叉树的应用
①输出叶子结点
通过前序遍历在访问时稍微小改动(添加个条件)即可实现。
②求二叉树的高度
思想:左右子树高度+1=树的高度
通过后序遍历的小改动,比较左右子树的高度,取max+1,递归算出树的高度
③二元运算表达式树及其遍历
前中后序分别对应前中后缀表达式
其中缀表达式是不准确的(因为运算优先级的限制),改进方法可以在输出左子树时添加括号,来准确表示运算顺序
而我们通过两种遍历可以唯一确定一个二叉树,但必须有中序遍历才行,因为先序和后序同时对于不同二叉树可能输出一样的值,即不唯一。
树的同构问题
这是PTA上练习,还没coding,后序会发布到我的blog,这里总结下老师给的思路。
1.二叉树的表示:这里用顺序(数组)表示,除了将其视为完全二叉树外,讲了一种结构数组(静态链表)的方法来表示二叉树。
2.建二叉树
3.同构的判断:注意逻辑的完整性

有两个问题后续值得思考:
①后序遍历非递归的实现算法编写
②树的同构的判别具体算法的编写

你可能感兴趣的:(三、树与二叉树)