天天看點

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隻是目前結點的其中一個引用罷了,上面那段代碼隻是引用改變了而已,堆還是原來的樣子。
20162317 2017-2018-1 《程式設計與資料結構》第9周學習總結 18章 堆

代碼托管

20162317 2017-2018-1 《程式設計與資料結構》第9周學習總結 18章 堆

上周考試錯題總結

  • 錯題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小時