20162317 2017-2018-1 《程序设计与数据结构》第9周学习总结 18章 堆

20162317 2017-2018-1 《程序设计与数据结构》第9周学习总结 18章 堆

教材学习内容总结

1、 堆的引入

.

2、堆的用处

  1.实现优先队列

  2.总能方便地得到元素集合中的最大(小)值(最大(小)值在根部)

  3.能够用来进行排序

3、堆的概念与性质

4、 堆的实现

教材学习中的问题和解决过程

  • 问题1:我在课本中看到这么一句话:“堆是一棵完全二叉树,其中每个元素都要大于或小于它的所有孩子”但下面的关键概念中也写着:“堆是一棵完全二叉树,其中每个元素大于等于其所有子结点的值”那每个元素是大于或小于其所有子结点还是大于等于其所有子结点??
  • 问题1解决方案:翻阅书后面的自测题SR18.1的答案,上面写着:“堆中的结点大于等于它的两个子结点”。

  因此可以得出结论,应该是每个元素大于或等于其所有子结点的值。

  补充:实际上,上面我得到的结论是最大堆的结论,最小堆的性质是:每个元素都小于等于它的孩子,也就说明了小于也是正确的。

  • 问题2:我在书中看到这么一句话:“堆是一种经典的是数据结构,常用来实现优先队列”,什么是优先队列,它与队列是否不同,若不同,不同处在哪里??
  • 问题2解决方案:在书的后面有对优先队列进行解释:
  1. 具有更高优先级的项排在前面
  2. 具有相同优先级的项按先进先出的规则排序
  • ...

代码调试中的问题和解决过程

  • 问题1:在单步跟踪LinkedMaxHeap的过程中,有个add方法:
@Override
    public void add(T element) {
        HeapNode<T> node = new HeapNode<T>(element);
        HeapNode<T> newParent = null;

        if (root == null) {
            root = node;
        } else {
            newParent = ((HeapNode<T>) root).getParentAdd(last);

            if (newParent.getLeft() == null) {
                newParent.setLeft(node);
            } else {
                newParent.setRight(node);
            }
        }

        node.setParent(newParent);
        last = node;

        ((HeapNode<T>) root).heapifyAdd(last);
    }

其中有段代码:

 node.setParent(newParent);

在add方法中已经明确表明

newParent.setLeft(node);

那设置node结点的父节点是newParent有什么意义?

  • 问题1解决方案:解决这个问题要结合HeapNode的代码。在HeapNode的代码中有个HeapNode的变量parent,在里面的很多方法里面,都有用到这个变量,书上也有说:“有到父节点的引用,这样就可以沿树中的路径移动。”因此setParent方法是在堆中必要的
  • 问题2:在看HeapNode中的heapifyAdd方法的时候,看到这么一句代码:
current = current.parent;

current都成为它自己的父节点了,那子结点还在吗?

  • 问题2解决方案:在!current只是当前结点的其中一个引用罢了,上面那段代码只是引用改变了而已,堆还是原来的样子。

代码托管

上周考试错题总结

  • 错题1:在一棵二叉查找树中,左子树的元素________根的元素

    A.大于

    B.小于

    C.大于或等于

    D.小于或等于

    E.等于

我的答案:B    标准答案:D

解析:当出现元素重复的情况,一个元素会作根,另一个相同的元素会作根的左子结点或右子结点

学习进度条

| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)
| -------- | :----------------😐:----------------😐:---------------: |:-----😐
| 目标 | 5000行 | 15篇 | 400小时 | |
| 第一周 | 200/200 | 2/2 | 20/20 | |
| 第二周 | 20/220 | 1/3 | 20/40
| 第三周 | 645/865 | 1/4 | 14/54 | |
| 第五周 | 654/1519 | 1/5 | 18/72
| 第六周 | 436/1955 | 1/6 | 16/88 | |
| 第七周 | 839/2794 | 2/8 | 20/108 |
| 第八周 | 2143/4937 | 2/10 | 25/133 |
| 第九周 | 1368/6305 | 2/12 | 18/151 ||

  • 计划学习时间:16小时

  • 实际学习时间:18小时

posted @ 2017-11-02 08:16  FunnyOne  阅读(287)  评论(0编辑  收藏  举报