数据结构与算法MOOC习题解题报告(PART 1:第6课-第8课)与PART 1总结

来源:互联网 发布:python 模拟火势蔓延 编辑:程序博客网 时间:2024/06/05 21:09

数算MOOC习题解题报告(PART 1:第6课-第8课)

第6课 二叉树II(Binary Trees II)(3题)

1.Huffman coding tree

这就是著名的Huffman编码算法,具体做法是找出最小的两个结点求和为一个结点,代价内累加这一结点价值。反复这一过程即可,如果用优先队列或堆实现这一算法十分迅速,因为只要找到最小结点,并且需要插入维护有序。但是本题数据很小,做一遍找一遍O(n)的复杂度也能接受。

2.Binary search tree

经典数据结构二叉搜索树,以链表实现二叉树,主要有插入,查找,删除操作。
查找其实原理比较简单,用二叉搜索树左边小于父结点,右边大于父结点性质即可。
插入的方法类似于查找,找到应该的位置后直接插入即可,如果已经有了就不插入。
而删除操作相对困难,不过本题不要求。大致原理是看有无左树,没有左树则删除该结点。右树代替该结点。如果有左树则用左树代替该结点,右数挂在左树中最大元素的右边即可。原理学习了,实现起来有些困难,由于指针操作十分容易出内存错误,一直调试不对,希望以后学习熟练了能写对,先掌握思想有个印象。

3.Expression Expression tree Expression evaluation

中缀表达式与后缀表达式互换,还要注意层次的细节,留待攻坚。

第7课 树与森林(Trees and Forest)(3题)

1.Level-order sequence with degree

本题没想到什么好的方法,直接用数组模拟储存树,然后再模拟推演找到子结点,也许预处理能快一点,但是数据非常小,也就没有优化了。

2.Specular reflection of a tree

注意树与二叉树互化中很重要的一点,转化后的二叉树左子树实际深度比父节点大一,而右子树实际深度与父节点一样。本题既然给出了二叉树结构,那么可以计算出每一个点的实际深度,再结合出现次序,可以给出实际树的bfs遍历结果。

3.食物链

综合题,留待百练练习。

第8课 图(Graphs)(3题)

1.我爱北大

这个题出得真文艺。
本题主要算法步骤就是一个储存字符串问题外加一个最短路算法。本题这里数据较小,选择用Floyd算法做。注意一个细节,本题可能有重边,这个时候看到一条边要看看是否已经有这条边了,比较一下大小再储存边。另外,要另一个数组记录下最短路
走法下的第一步,再据此递归还原路径。这个数组随Floyd算法循环时同步更新,就像动态规划一样(Floyd算法本质就是dp)

2.拓扑排序

按照拓扑排序定义来即可,先记录每个点的入度,删去入度为0的节点输出,再更新所有点的入度,即这个点相邻点的入度减去一即可。反复这一过程即可。

3.Finding Nemo

综合题,留待百练练习。


数据结构与算法PART 1总结

PART 1主要难点与算法包括:

概论

算法复杂度定义与表示 其中 O,Ω,Θ
复杂度计算分析方法

线性表

链表

栈与队列

利用栈计算后缀表达式的值以及中缀转后缀
dfs,bfs中的栈与队列

字符串

字符串编码与储存
KMP模式匹配

二叉树

二叉树概念
二叉树先序中序后序遍历,与已知中序与另一序递归求解二叉树
二叉树宽度优先遍历
二叉树链表表示
有关二叉树的递归算法
二叉搜索树
堆与优先队列
Huffman树

树与森林与二叉树互化,左子右兄表示法
树的先序中序后序与宽度优先遍历及对应二叉树的相关遍历以及限制求解
树根表示法与集合,并查集

图的基本表示方法
图的周游:dfs,bfs,拓扑排序
最短路算法,Floyd,Dijkstra
最小生成树算法,Prim,Kruskal

0 0