20172330 2018-2019-1 《程序設計與數據結構》第七周學習總結
20172330 2018-2019-1 《程序設計與數據結構》第七周學習總結
教材學習內容總結
二叉查找樹
在二叉查找樹中:
- 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
- 任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
- 葉節點的左、右子樹也分別為二叉查找樹。
- 沒有鍵值相等的節點。
插入刪除
與次優二叉樹相對,二叉排序樹是一種動態樹表。其特點是:樹的結構通常不是一次生成的,而是在查找過程中,當樹中不存在關鍵字等於給定值的結點時再進行插入。新插入的結點一定是一個新添加的葉子結點,並且是查找不成功時查找路徑上訪問的最後一個結點的左孩子或右孩子結點。
1.首先執行查找算法,找出被插結點的父親結點。
若二叉樹為空。則首先單獨生成根結點。首先執行查找算法,找出被插結點的父親結點。
判斷被插結點是其父親結點的左、右兒子。將被插結點作為葉子結點插入。
若二叉樹為空。則首先單獨生成根結點。2.執行刪除結點算法
在二叉排序樹刪去一個結點,分三種情況討論:
1.若結點為葉子結點,即左子樹和右子樹均為空樹。由於刪去葉子結點不破壞整棵樹的結構,則可以直接刪除此子結點。
2.若結點只有左子樹或右子樹,此時只要令或直接成為其雙親結點的左子樹或右子樹即可,作此修改也不破壞二叉排序樹的特性。
3.若結點的左子樹和右子樹均不空。在刪去結點之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以:
平衡二叉查找樹
平衡二叉查找樹是帶有平衡條件的二叉查找樹。平衡條件:每個節點的左子樹和右子樹的高度差最多為1二叉查找樹(其中空樹的高度為-1)
思想:
向平衡二叉樹中插入一個新結點後破壞了平衡二叉樹的平衡性。首先要找出插入新結點後失去平衡的最小子樹根結點的指針。然後再調整這個子樹中有關結點之間的鏈接關系,使之成為新的平衡子樹。當失去平衡的最小子樹被調整為平衡子樹後,原有其他所有不平衡子樹無需調整,整個二叉排序樹就又成為一棵平衡二叉樹。
AVL樹
- AVL樹的旋轉規律:
AVL樹的基本操作一般涉及運做同在不平衡的二叉查找樹所運做的同樣的算法。但是要進行預先或隨後做一次或多次所謂的"AVL旋轉"。
假設由於在二叉排序樹上插入結點而失去平衡的最小子樹根結點的指針為a(即a是離插入點最近,且平衡因子絕對值超過1的祖先結點),則失去平衡後進行進行的規律可歸納為下列四種情況:
LL型
平衡二叉樹某一節點的左孩子的左子樹上插入一個新的節點,使得該節點不再平衡。這時只需要把樹向右旋轉一次即可,如圖所示,原A的左孩子B變為父結點,A變為其右孩子,而原B的右子樹變為A的左子樹,註意旋轉之後Brh是A的左子樹(圖上忘在A於Brh之間標實線)
RR型
平衡二叉樹某一節點的右孩子的右子樹上插入一個新的節點,使得該節點不再平衡。這時只需要把樹向左旋轉一次即可,如圖所示,原A右孩子B變為父結點,A變為其左孩子,而原B的左子樹Blh將變為A的右子樹。
LR型
平衡二叉樹某一節點的左孩子的右子樹上插入一個新的節點,使得該節點不再平衡。這時需要旋轉兩次,僅一次的旋轉是不能夠使二叉樹再次平衡。如圖所示,在B節點按照RR型向左旋轉一次之後,二叉樹在A節點仍然不能保持平衡,這時還需要再向右旋轉一次。
RL型
平衡二叉樹某一節點的右孩子的左子樹上插入一個新的節點,使得該節點不再平衡。同樣,這時需要旋轉兩次,旋轉方向剛好同LR型相反。
紅黑樹
- 1.紅黑樹是在普通二叉樹上,對沒個節點添加一個顏色屬性形成的,同時整個紅黑二叉樹需要同時滿足一下五條性質
紅黑樹需要滿足的五條性質:
性質一:節點是紅色或者是黑色;
在樹裏面的節點不是紅色的就是黑色的,沒有其他顏色,要不怎麽叫紅黑樹呢,是吧。
性質二:根節點是黑色;
根節點總是黑色的。它不能為紅。
性質三:每個葉節點(NIL或空節點)是黑色;
性質四:每個紅色節點的兩個子節點都是黑色的(也就是說不存在兩個連續的紅色節點);
就是連續的兩個節點不能是連續的紅色,連續的兩個節點的意思就是父節點與子節點不能是連續的紅色。
性質五:從任一節點到其沒個葉節點的所有路徑都包含相同數目的黑色節點;
教材學習中的問題和解決過程
- 問題1:二叉查找樹如何添加元素?
- 問題1解決方案:首先我們需要了解二叉樹中元素是如何放置的。我們定義一個根的元素,然後把新加進來的元素和根比較(以第二個加進來的元素為10,根為20舉例)。10<20,所以我們將10放在根的左結點,由於根的左子樹目前只有一個元素所以我們將10設置為根的左子樹的根。如果第三個元素是11,那麽我們首先和根比較,小於20,那麽我們將11往下放,與10比較,比10大,那麽我們放在10的右結點上。(如果添加的元素比20小也比10小那麽放在10的左結點)以此類推。右子樹也是一樣的道理。總的來說,二叉樹的元素放置是以根為基準,比根大的放右子樹,比根小的放左子樹。如果一樣的話左右子樹任君挑選。
- 問題2:紅黑樹的元素查找
- 問題2解決方案
1、當插入的節點是根節點時,直接塗黑即可;
2、當要插入的節點的父節點是黑色的時候。
3、如果要插入的節點的父節點是紅色且父節點是祖父節點的左支的時候。
這個要分兩種情況,一種是叔叔節點為黑的情況,一種是叔叔節點為紅的情況。
當叔叔為黑時,也分為兩種情況,一種是要插入的節點是父節點的左支,另一種是要插入的節點是父親的右支。
我們先看一下當要插入的節點是父節點的左支的情況:
這個時候違反了性質四,我們就需要進行調整操作,使之符合性質四,我們可以通過對祖父節點進行右旋同時將祖父節點和父節點的顏色進行互換,這樣就變成了:
經過這樣的調整可以符合性質四並且不對其他性質產生破壞。
當插入的節點是父節點的右支的時候:
當要插入的節點是父節點的右支的時候,我們可以先對父節點進行左旋,變成如下:
如果我們把原先的父節點看做是新的要插入的節點,把原先要插入的節點看做是新的父節點,那就變成了當要插入的節點在父節點的左支的情況,對,是的,就是按照當要插入的節點在父節點的左支的情況進行旋轉,旋轉完之後變成如下:
4、如果要插入的節點的父節點是紅色且父節點是祖父節點的右支的時候;
這個時候的情況跟情況3所表述的情況是一個鏡像,將情況3的左和右互換一下就可以了。
5、如果要插入的節點的父節點是紅色並且叔叔節點也為紅色,如下:
這個時候,只需將父親節點和叔叔節點塗黑,將祖父節點塗紅。
以上就是插入的全部過程。
代碼調試中的問題和解決過程
- 問題1:在編寫樹的方法時,RemoveFirst方法一直報錯
- 問題1解決方案:在檢查後發現是在ListADT時沒有寫進去導致出現了錯誤。
代碼托管
上周考試錯題總結
無
結對及互評
- 基於評分標準,我給嚴域俊的博客打分:7分。得分情況如下:
正確使用Markdown語法(加1分)
模板中的要素齊全(加1分)
教材學習中的問題和解決過程, (加3分)
感想,體會真切的(加1分)
點評認真,能指出博客和代碼中的問題的(加1分)
- 博客中值得學習的或問題:
- 圖片和文字相結合,方便理解。
- 增加了博客中的目錄,方便查看,同時樣式進行了更新,顯得更加美觀
- 閱讀了許多資料,使得博客更有說服力。
- 代碼中值得學習的或問題:
- commit依舊很詳細,有條理性。
點評過的同學博客和代碼
- 本周結對學習情況
- 20172333
- 結對學習內容
教材第9章,運行教材上的代碼
完成課後自測題,並參考答案學習
完成課後自測題,並參考答案學習
完成程序設計項目:至少完成PP9.2、PP9.3
其他(感悟、思考等,可選)
這一周花了點心思在這一章上面,也好好閱讀了很多內容,掌握的還算可以。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 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/7 | 10/60 |
參考:軟件工程軟件的估計為什麽這麽難,軟件工程 估計方法
計劃學習時間:10小時
實際學習時間:10小時
參考資料
《Java程序設計與數據結構教程(第四版)》
《Java程序設計與數據結構教程(第四版)》學習指導
最容易懂得紅黑樹
20172330 2018-2019-1 《程序設計與數據結構》第七周學習總結