一、学习小结:数结构是一类重要的非线性结构,它的应用很广泛,并且以二叉树最为常用。
1、树的定义是递归定义,而且在树这一章中,递归用得比较多。我记得老师讲解栈与递归时,写递归的程序要弄清楚它的终止条件以及另外一个向着终止条件靠近的条件,停留在本层,把本层的逻辑写正确。
2、树的基本术语:
①结点:树中的一个独立单元。
②结点的度:结点拥有的子树数(分支的个数)。
③树的度:是树内各结点度的最大值。
④叶子(终端结点):度为0的结点。
⑤非终端结点(分支结点):度不为0的结点。
⑥双亲和孩子:结点的子树的根称为该结点的孩子,该结点称为孩子的双亲。
⑦兄弟:同一个双亲的孩子之间互称兄弟。
⑧树的深度(高度):树中结点的最大层次。
其他:祖先、子孙、层次、堂兄弟、有序树(将树中结点的各个子树看成从左到右是有次序的)和无序树、森林
这些基本的术语应该要牢牢记住,否则很容易混淆,最好是能自己画个图,根据概念注记,可以帮助我们更好地去记忆它们。
3、二叉树的性质
(1)二叉树在第i层上至多有2i-1个结点
(2)深度为k的二叉树至多有2k-1个结点(k>=1)
(3)对于任何一棵二叉树T,其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
(4)具有n个结点的完全二叉树的深度为log2 n+1
(5)对一棵有n个结点的完全二叉树,按层序编号,对任一结点i:①i=1,则i为根;i>1,则双亲为i/2向下取整;②若2i>n,则结点i无左孩子;否则其左孩子为2i;③若2i+1>n,则i无右孩子;否则其右孩子为2i+1
对于不是很理解的性质,看过书后,我会尝试画些简单的满足要求的树来帮助自己去理解;接着在根据书中的描述,再认真地去看看证明过程,促进理解二叉树的这些性质。
4、二叉树的存储结构
顺序存储结构(一般适用于完全二叉树,避免造成空间的较大浪费)、链式存储结构(对于一般的二叉树,更适合使用链式存储结构)(二叉链表和三叉链表:多个双亲指针)
5、遍历二叉树
先序遍历(根左右)、中序遍历(左根右)、后序遍历(左右根)、层次遍历
前面三种遍历,编写程序时可以从一种遍历得到另一种遍历,只需要做些语句顺序的变更。
6、哈夫曼树(最优树)
①路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径
②路径长度:路径上的分支数目
③树的路径长度:从根到每一结点的路径长度之和
结点的带权路径长度、树的带权路径长度(WPL)
给定n个权值,构造出来的最优树不一定是唯一的。
哈夫曼树的构造
二、做实践题:深入虎穴的学习心得
著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。
内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。
输入格式:
输入首先在一行中给出正整数 N(<105),是门的数量。最后 N 行,第 i 行(1≤i≤N)按以下格式描述编号为 i 的那扇门背后能通向的门:
K D[1] D[2] ... D[K]
其中 K 是通道的数量,其后是每扇门的编号。
首先要根据题目确定存储结构,用数组
用数组的话,根据题目会申请很大的空间,并且可能会造成空间的浪费,而此时又可以用到稀疏矩阵的三元组解决空间浪费问题。
而上机时,老师教我们使用另外的方法:
将通道(门)数量和一个指向具体的门的指针打包成一个结构体,如下
对于相应的门的数量后的编号,可以动态申请一个一个结点的空间,也可以动态申请一个数组空间存放门的编号,而鉴于没有对数据不断的删除和插入等操作,最终采用了动态申请一个数组空间。
上课的时候,老师带我们读完题目后进行思考,考虑到这个和之前找叶子结点不太一样:它的输入是不规则的,这样的话要解决这个问题。编程面对的问题还是很少,自己解决问题的思维也不足够,需要多从作业和实践中积累相应的解决方案,同时拓展思维。
三、目标执行情况
KMP算法还是不太能理解,还有那个next函数,不明白它如何达到相应的目的,我应该多去请教其他同学对这个算法的理解,促进自己的理解。
四、目标:1、整理一下本次作业和实践的解题思路,并做好相应的笔记,注意拓展思维。2、对于二叉树中的一些性质还要再去加深印象,理解好。