20172327 2018-2019-1 《程序設計與數據結構》第七週學習總結

20172327 2018-2019-1 《程序設計與數據結構》第七週學習總結

教材學習內容總結

第十一章 二叉查找樹

概述


1.二叉查找樹是一種帶有附加屬性的二叉樹,即對樹的每一個結點都有左結點小於父結點,右結點小於或等於父結點。

2.二叉查找樹的定義是二叉樹定義的擴展。

3.

方法 描述
addElement 往樹中添加一個元素
removeElement 從樹中刪除一個元素
removeAllOccurrences 從樹中刪除所指定元素的任何存在
removeMin 刪除樹中最小的元素
removeMax 刪除樹中最大的元素
findMin 返回一個指向樹中最小元素的引用
findMax 返回一個指向樹中最小元素的引用

用鏈表實現二叉查找樹


1.每一個BinaryTreeNode對象要維護一個指向結點所儲存元素的引用,另外還要維護指向結點的每一個孩子的引用。

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


1.用BinarySearchTreeList類實現ListADT接口和OrderedListADT接口。

2.

操做 說明
add 向列表添加一個元素
removeFirst 刪除列表的首元素
removeLast 刪除列表的末元素
remove 刪除列表中一個特定元素
first 考察列表前端那個元素
last 考察列表末端那個元素
contains 斷定列表是否含有一個特定元素
is Empty 斷定列表是否爲空
size 斷定列表中的元素數目


3.樹的主要使用之一就是爲其餘集合提供高效的實現。

4.BinarySearchTreeList實現的分析:html

操做 說明 LinkedList BinarySearchTreeList
add 向列表添加一個元素 O(n) O(log n)*
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操做和remove操做均可能致使樹變得不平衡。前端

平衡二叉查找樹


1.若是二叉查找樹不平衡,其效率可能比線性結構還要低。

2.維護樹的平衡有着多種算法,有些蠻力方法(中序遍歷,把數組的中間元素做爲樹根,再構造出左平衡子樹和右平衡子樹。),有些方案更優美(AVL樹和紅黑樹)。

3.右旋: 在最小平衡子樹根節點平衡因子>=2且在根節點的左孩子的左孩子插入元素,進行右旋

  • 使樹根的左孩子元素成爲新的根元素。
  • 使原根元素成爲這個新樹根的右孩子元素。
  • 使原樹根的左孩子的右孩子,成爲原樹根的新的左孩子。


4.左旋: 在最小平衡子樹根節點平衡因子>=-2且在根節點的右孩子的右孩子插入元素,進行左旋。git

  • 使樹根的右孩子元素成爲新的根元素。
  • 使原根元素成爲這個新樹根的左孩子元素。
  • 使原樹根的右孩子的左孩子,成爲原樹根的新的右孩子。


5.右左旋:最小平衡子樹根節點(80)的右孩子(100)的左孩子(90)的子節點(95)插入新元素,先繞根節點的右孩子節點(100)右旋,再圍根節點(80)左旋
算法


6.左右旋:在最小平衡子樹根節點(80)的左孩子(50)的右孩子(70)的子節點插入新元素,先繞根節點的左孩子節點(50)右旋,再圍根節點(80)左旋
數組

實現二叉查找樹:AVL樹


1.右子樹的高度減去左子樹的高度稱爲該結點的平衡因子。

2.樹(或樹的任何子樹)只有兩種途徑能變得不平衡:插入結點或刪除結點。

3.由於須要上溯樹,因此AVL樹一般最好實現爲每一個結點都包含一個指向其父結點的引用。

4.AVL樹的插入操做首先會按照普通搜索二叉樹的插入操做進行,當插入一個數據後,咱們會沿着插入數據時所通過的的節點回溯,回溯的過程當中會判回溯路徑中的每一個節點的左子支高度與右子支高度之差的絕對值是否超過1,若是超過1咱們就進行調整,調整的目的是使得該節點知足AVL樹平衡的定義。

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

  • 問題1:如何理解紅黑樹?
  • 解決方案:紅黑樹和以前所講的AVL樹相似,都是在進行插入和刪除操做時經過特定操做保持二叉查找樹的平衡,從而得到較高的查找性能。自從紅黑樹出來後,AVL樹就被放到了博物館裏,聽說是紅黑樹有更好的效率,更高的統計性能。不過在我瞭解了紅黑樹的實現原理後,並不相信這是真的,關於這一點咱們會在後面進行討論。
    紅黑樹和AVL樹的區別在於它使用顏色來標識結點的高度,它所追求的是局部平衡而不是AVL樹中的很是嚴格的平衡。以前咱們在講解AVL樹時,已經領教過AVL樹的複雜,但AVL樹的複雜比起紅黑樹來講簡直是小巫見大巫。紅黑樹是真正的變態級數據結構。

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

代碼託管

結對及互評

正確使用Markdown語法(加1分)
模板中的要素齊全(加1分)
教材學習中的問題和解決過程, (加3分)
代碼調試中的問題和解決過程, 無問題
感想,體會真切的(加1分)
點評認真,能指出博客和代碼中的問題的(加1分)數據結構

  • 20172317
    基於評分標準,我給以上博客打分:4分。得分狀況以下:他沒寫
  • 20172320
    基於評分標準,我給以上博客打分:8分。得分狀況以下:性能

    • 結對學習內容
      • 教材第11章,運行教材上的代碼
      • 完成課後自測題,並參考答案學習
      • 完成程序設計項目:至少完成PP11.三、PP11.8

其餘(感悟、思考等,可選)

在紅黑樹這一結,沒看懂,很迷,我還須要再花點時間學習

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 8/8
第二週 1306/1306 1/2 20/28
第三週 1291/2597 1/3 18/46
第四周 4361/6958 2/3 20/66
第五週 1755/8713 1/6 20/86
第六週 3349/12062 1/7 20/106
第七週 3308/15370 1/8 20/126

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法.net

  • 計劃學習時間:10小時設計

  • 實際學習時間:8小時

  • 改進狀況:

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表
)

參考資料

相關文章
相關標籤/搜索