20172319 《程序設計與數據結構》 第七週學習總結

20172319 2018.10.27-11.02

《程序設計與數據結構》第7周學習總結

目錄


教材學習內容總結

第十一章 二叉查找樹

  • 11.1 概述:html

  • 二叉查找樹(binary search tree) : 具備附加屬性 的二叉樹;即對於樹中的每一個結點:左孩子小於父節點,父節點小於等於右孩子。
  • 二叉查找樹的操做
  • 操做 說明
    addElement 往樹中添加一個元素
    removeElement 從樹中刪除一個元素
    removeAllOccurrences 從樹中刪除所指定元素的任何存在
    removeMin 刪除樹中的最小元素
    removeMax 刪除樹中的最大元素
    findMin 返回一個指向樹中最小元素的引用
    findMax 返回一個指向樹中最大元素的引用
  • 11.2 用鏈表實現二叉查找樹 前端

  • 11.2.1 addElement操做:git

  • 1.若樹爲空,新元素成爲根結點;
  • 2.若樹非空,新元素與樹根元素進行比較:
  • (1)若其小於根結點存儲的元素:
  • 若左孩子爲空,新元素成爲根的左孩子;若左孩子不爲空,則遍歷根的左孩子,再次進行比較操做。
  • (2)若其大於或等於根結點存儲的元素:
  • 若右孩子爲空,新元素成爲根的右孩子;若右孩子不爲空,則遍歷根的右孩子,再次進行比較操做。數組

  • 11.2.2 removeElement操做:
    數據結構

  • 必需要推出 另外一個結點來代替要被刪除的那個結點。
  • 用protected封裝的replacement方法返回指向一個結點的引用,該結點將代替要刪除的結點。
  • 選擇替換結點的三種狀況以下:
  • 1.若被刪除結點無孩子,則replacement返回null;
  • 2.若被刪除的結點只有一個右孩子,則replacement返回此孩子;
  • 3.若被刪除的結點有兩個孩子,則replacement返回中序遍歷中的後繼者。學習

  • 11.2.3 removeAllOccurrences操做:.net

  • 反覆調用removeElement方法來刪除某一指定元素的全部存在。設計

  • 11.2.4 removeMin操做:
    3d

  • 最小元素在二叉查找樹中的三種可能情形:
  • 1.若根無左孩子,則其爲最小元素,而其右結點會變成新的根結點;
  • 2.若樹的最左側結點是一片葉子,則這片葉子就是最小元素,只需設置其父節點的左孩子爲null便可;
  • 3.若樹的最左側結點是一個內部結點,則須要設置其父結點的左孩子引用指向這個將刪除結點的右孩子。調試

  • 11.3 用有序列表實現二叉查找樹

  • 列表的一些常見操做:
  • 操做 描述
    removeFirst 從列表中刪除第一個元素
    removeLast 從列表中刪除最後一個元素
    remove 從列表中刪除某個元素
    first 查看位於列表前端的元素
    last 查看位於列表末端的元素
    contains 肯定列表是否含有某一個元素
    isEmpty 斷定列表是否爲空
    size 肯定列表中的元素數量
  • 有序列表的特有操做:
  • 操做 描述
    add 向列表中添加一個元素
  • 11.3.1 BinarySearchTree實現的分析:

  • 在BinarySearchTreeList實現中用到的LinkedBinarySearchTree實現是一種具備附加屬性的平衡二叉查找樹;
  • 附加屬性:假設樹中存儲的元素數目是n,則任何結點的最大深度爲log2n
  • 有序列表的鏈表實現分析和二叉查找樹實現分析:
  • 操做 LinkedList BinarySearchTreeList
    removeFirst O(1) O(log n)
    removeLast O(n) O(log n)
    remove O(n) O(log n)*
    first O(1) O(log n)
    last O(n) O(log n)
    contains O(n) O(log n)
    isEmpty O(1) O(1)
    size O(1) O(1)
    add O(n) O(log n) *
    add操做和remove操做均可能致使樹變得不平衡
  • 11.4 平衡二叉查找樹
  • 只有保持平衡,二叉樹的查找效率纔會高。
  • 實現目的:保持樹的最大路徑長度趨近於:log2n
  • 銳化樹(degenerate tree)
  • 其看起來更像是一個鏈表,然而其效率卻比鏈表還低,其附帶了額外的開銷。

  • 若無平衡假設,則最壞狀況下addElement操做的時間複雜度爲O(n)而不是O(log n),樹根是最小元素,而即將被插入的元素可能成爲樹中的最大元素。

  • 11.4.1 右旋(right rotation):
  • 左孩子繞着其父結點向右旋轉;

  • 旋轉前,x是p的左兒子。x的右兒子(若存在)變爲p的左兒子,p變爲x的右兒子。

  • 11.4.2 左旋(left rotation):
  • 右孩子繞着其父結點向左旋轉;
  • 旋轉前,x是p的右兒子。x的左兒子(若存在)變爲p的右兒子,p變爲x的左兒子。

  • 許多時候,一棵不平衡樹要趨近平衡所須要的旋轉不止一次。
  • 11.4.3 右左旋(rightleft rotation):

  • 11.4.3 左右旋(leftright rotation):

  • 11.5 實現二叉查找樹:AVL樹

  • 一種高度平衡的二叉查找樹,其能儘量地下降樹的高度,以此減小樹的平均查找長度。
  • 性質:
  • 1.左右子樹高度差的絕對值不超過1 ;
  • 2.樹中的每一個子樹都是AVL樹;
  • 3.每一個節點都有一個平衡因子(balance factor),任一節點的平衡因子是-1,0,1。(每一個節點的平衡因子等於右子樹的高度減去左子樹的高度 )

  • 11.6 實現二叉查找樹:紅黑樹

返回目錄


教材學習中的問題和解決過程

  • 問題1:2-3-4樹?
  • 解決:

返回目錄


代碼調試中的問題和解決過程

  • 問題1:如何刪除某一指定結點的子樹。

  • 解決:

返回目錄


代碼託管

返回目錄


上週考試錯題總結

  • 錯題1:

  • 解決: 應是父結點小於等於右孩子。
  • 錯題2:

  • 解決:O(nlog(n))的變化速度最慢。
  • 錯題3:

  • 解決:二分查找利用的是查找池已排序這一事實。
  • 錯題4:

  • 解決:二分查找利用的是查找池已排序這一事實。

返回目錄


結對及互評

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20172316趙乾宸
    • 博客中值得學習的或存在問題:
    • 20172329王文彬
    • 博客中值得學習的或存在問題:
    • 博客內容充實、排版整齊、對教材內容有通過一番認真思考、繼續保持。
    • 代碼截圖作標註時應儘可能避免遮擋代碼。
    • Markdown的部分縮進有誤。
    • 教材問題2提出得很好,能夠看出近斷時間來反覆使用鏈表、數組去實現同一類型的數據結構起得了必定的成效。

返回目錄


學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 3000行 15篇 300小時
第一週 0/0 1/1 12/12
第二週 935/935 1/2 24/36
第三週 849/1784 1/3 34/70
第四周 3600/5384 1/5 50/120
第五週 2254/7638 1/7 50/170
第六週 2809/10447 1/9 45/215
第七週 3700/14147 1/10 40/255

返回目錄


參考資料

相關文章
相關標籤/搜索