数算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.食物链
综合题,留待百练练习。