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

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

教材學習內容總結

二叉查找樹


在二叉查找樹中:html

  • 若任意節點的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值;
  • 任意節點的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值;
  • 葉節點的左、右子樹也分別爲二叉查找樹。
  • 沒有鍵值相等的節點。

插入刪除

與次優二叉樹相對,二叉排序樹是一種動態樹表。其特色是:樹的結構一般不是一次生成的,而是在查找過程當中,當樹中不存在關鍵字等於給定值的結點時再進行插入。新插入的結點必定是一個新添加的葉子結點,而且是查找不成功時查找路徑上訪問的最後一個結點的左孩子或右孩子結點。git

  • 1.首先執行查找算法,找出被插結點的父親結點。
    判斷被插結點是其父親結點的左、右兒子。將被插結點做爲葉子結點插入。
    若二叉樹爲空。則首先單獨生成根結點。首先執行查找算法,找出被插結點的父親結點。
    判斷被插結點是其父親結點的左、右兒子。將被插結點做爲葉子結點插入。
    若二叉樹爲空。則首先單獨生成根結點。算法

  • 2.執行刪除結點算法
    在二叉排序樹刪去一個結點,分三種狀況討論:
    1.若結點爲葉子結點,即左子樹和右子樹均爲空樹。因爲刪去葉子結點不破壞整棵樹的結構,則能夠直接刪除此子結點。
    2.若結點只有左子樹或右子樹,此時只要令或直接成爲其雙親結點的左子樹或右子樹便可,做此修改也不破壞二叉排序樹的特性。
    3.若結點的左子樹和右子樹均不空。在刪去結點以後,爲保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,能夠:
    令結點的直接前驅(或直接後繼)替代該結點,而後再從二叉排序樹中刪去它的直接前驅(或直接後繼)即讓結點的左子樹(若是有的話)成爲結點左子樹的最左下結點(若是有的話),再讓左子樹成爲結點的左右結點的父結點。數據結構

平衡二叉查找樹

平衡二叉查找樹是帶有平衡條件的二叉查找樹。平衡條件:每一個節點的左子樹和右子樹的高度差最多爲1二叉查找樹(其中空樹的高度爲-1)
思想:
向平衡二叉樹中插入一個新結點後破壞了平衡二叉樹的平衡性。首先要找出插入新結點後失去平衡的最小子樹根結點的指針。而後再調整這個子樹中有關結點之間的連接關係,使之成爲新的平衡子樹。當失去平衡的最小子樹被調整爲平衡子樹後,原有其餘全部不平衡子樹無需調整,整個二叉排序樹就又成爲一棵平衡二叉樹。學習

AVL樹

  • AVL樹的旋轉規律:
    AVL樹的基本操做通常涉及運作同在不平衡的二叉查找樹所運作的一樣的算法。可是要進行預先或隨後作一次或屢次所謂的"AVL旋轉"。

假設因爲在二叉排序樹上插入結點而失去平衡的最小子樹根結點的指針爲a(即a是離插入點最近,且平衡因子絕對值超過1的祖先結點),則失去平衡後進行進行的規律可概括爲下列四種狀況:.net

  1. LL型
    平衡二叉樹某一節點的左孩子的左子樹上插入一個新的節點,使得該節點再也不平衡。這時只須要把樹向右旋轉一次便可,如圖所示,原A的左孩子B變爲父結點,A變爲其右孩子,而原B的右子樹變爲A的左子樹,注意旋轉以後Brh是A的左子樹(圖上忘在A於Brh之間標實線)
    設計

  2. RR型
    平衡二叉樹某一節點的右孩子的右子樹上插入一個新的節點,使得該節點再也不平衡。這時只須要把樹向左旋轉一次便可,如圖所示,原A右孩子B變爲父結點,A變爲其左孩子,而原B的左子樹Blh將變爲A的右子樹。
    指針

  3. LR型
    平衡二叉樹某一節點的左孩子的右子樹上插入一個新的節點,使得該節點再也不平衡。這時須要旋轉兩次,僅一次的旋轉是不可以使二叉樹再次平衡。如圖所示,在B節點按照RR型向左旋轉一次以後,二叉樹在A節點仍然不能保持平衡,這時還須要再向右旋轉一次。
    調試

  4. RL型
    平衡二叉樹某一節點的右孩子的左子樹上插入一個新的節點,使得該節點再也不平衡。一樣,這時須要旋轉兩次,旋轉方向恰好同LR型相反。
    htm

紅黑樹

  • 1.紅黑樹是在普通二叉樹上,對沒個節點添加一個顏色屬性造成的,同時整個紅黑二叉樹須要同時知足一下五條性質
    紅黑樹須要知足的五條性質:
    性質一:節點是紅色或者是黑色;
    在樹裏面的節點不是紅色的就是黑色的,沒有其餘顏色,要不怎麼叫紅黑樹呢,是吧。
    性質二:根節點是黑色;
    根節點老是黑色的。它不能爲紅。
    性質三:每一個葉節點(NIL或空節點)是黑色;

    性質四:每一個紅色節點的兩個子節點都是黑色的(也就是說不存在兩個連續的紅色節點);
    就是連續的兩個節點不能是連續的紅色,連續的兩個節點的意思就是父節點與子節點不能是連續的紅色。
    性質五:從任一節點到其沒個葉節點的全部路徑都包含相同數目的黑色節點;

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

  • 問題1:二叉查找樹如何添加元素?
  • 問題1解決方案:首先咱們須要瞭解二叉樹中元素是如何放置的。咱們定義一個根的元素,而後把新加進來的元素和根比較(以第二個加進來的元素爲10,根爲20舉例)。10<20,因此咱們將10放在根的左結點,因爲根的左子樹目前只有一個元素因此咱們將10設置爲根的左子樹的根。若是第三個元素是11,那麼咱們首先和根比較,小於20,那麼咱們將11往下放,與10比較,比10大,那麼咱們放在10的右結點上。(若是添加的元素比20小也比10小那麼放在10的左結點)以此類推。右子樹也是同樣的道理。總的來講,二叉樹的元素放置是以根爲基準,比根大的放右子樹,比根小的放左子樹。若是同樣的話左右子樹任君挑選。
  • 問題2:紅黑樹的元素查找
  • 問題2解決方案

一、當插入的節點是根節點時,直接塗黑便可;
二、當要插入的節點的父節點是黑色的時候。
三、若是要插入的節點的父節點是紅色且父節點是祖父節點的左支的時候。
這個要分兩種狀況,一種是叔叔節點爲黑的狀況,一種是叔叔節點爲紅的狀況。
當叔叔爲黑時,也分爲兩種狀況,一種是要插入的節點是父節點的左支,另外一種是要插入的節點是父親的右支。
咱們先看一下當要插入的節點是父節點的左支的狀況:

這個時候違反了性質四,咱們就須要進行調整操做,使之符合性質四,咱們能夠經過對祖父節點進行右旋同時將祖父節點和父節點的顏色進行互換,這樣就變成了:

通過這樣的調整能夠符合性質四而且不對其餘性質產生破壞。
當插入的節點是父節點的右支的時候:

當要插入的節點是父節點的右支的時候,咱們能夠先對父節點進行左旋,變成以下:

若是咱們把原先的父節點看作是新的要插入的節點,把原先要插入的節點看作是新的父節點,那就變成了當要插入的節點在父節點的左支的狀況,對,是的,就是按照當要插入的節點在父節點的左支的狀況進行旋轉,旋轉完以後變成以下:

四、若是要插入的節點的父節點是紅色且父節點是祖父節點的右支的時候;
這個時候的狀況跟狀況3所表述的狀況是一個鏡像,將狀況3的左和右互換一下就能夠了。
五、若是要插入的節點的父節點是紅色而且叔叔節點也爲紅色,以下:

這個時候,只需將父親節點和叔叔節點塗黑,將祖父節點塗紅。

以上就是插入的所有過程。

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

  • 問題1:在編寫樹的方法時,RemoveFirst方法一直報錯
  • 問題1解決方案:在檢查後發現是在ListADT時沒有寫進去致使出現了錯誤。

代碼託管

上週考試錯題總結

結對及互評

  • 基於評分標準,我給嚴域俊的博客打分:7分。得分狀況以下:

正確使用Markdown語法(加1分)

模板中的要素齊全(加1分)

教材學習中的問題和解決過程, (加3分)

感想,體會真切的(加1分)

點評認真,能指出博客和代碼中的問題的(加1分)

  • 博客中值得學習的或問題:
    • 圖片和文字相結合,方便理解。
    • 增長了博客中的目錄,方便查看,同時樣式進行了更新,顯得更加美觀
    • 閱讀了許多資料,使得博客更有說服力。
  • 代碼中值得學習的或問題:
    - commit依舊很詳細,有條理性。

點評過的同窗博客和代碼

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

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

這一週花了點心思在這一章上面,也好好閱讀了不少內容,掌握的還算能夠。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 10/10
第二週 700/700 1/2 10/20
第三週 700/1400 1/3 10/30
第四周 500/1900 2/5 10/40
第五週 569/2469 1/6 10/50
第六週 1070/3539 1/7 10/60
第七週 1070/3539 1/8 10/70

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

  • 計劃學習時間:10小時

  • 實際學習時間:10小時

參考資料

相關文章
相關標籤/搜索