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只是当前结点的其中一个引用罢了,上面那段代码只是引用改变了而已,堆还是原来的样子。

1062692-20171102081614545-808725584.jpg

代码托管

1062692-20171105091925295-701865235.jpg

上周考试错题总结

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

    A.大于

    B.小于

    C.大于或等于

    D.小于或等于

    E.等于

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

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

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)
目标5000行15篇400小时
第一周200/2002/220/20
第二周20/2201/320/40
第三周645/8651/414/54
第五周654/15191/518/72
第六周436/19551/616/88
第七周839/27942/820/108
第八周2143/49372/1025/133
第九周1368/63052/1218/151
  • 计划学习时间:16小时

  • 实际学习时间:18小时

转载于:https://www.cnblogs.com/VersionP1/p/7770525.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值