在二叉查找樹中:html
與次優二叉樹相對,二叉排序樹是一種動態樹表。其特色是:樹的結構一般不是一次生成的,而是在查找過程當中,當樹中不存在關鍵字等於給定值的結點時再進行插入。新插入的結點必定是一個新添加的葉子結點,而且是查找不成功時查找路徑上訪問的最後一個結點的左孩子或右孩子結點。git
1.首先執行查找算法,找出被插結點的父親結點。
判斷被插結點是其父親結點的左、右兒子。將被插結點做爲葉子結點插入。
若二叉樹爲空。則首先單獨生成根結點。首先執行查找算法,找出被插結點的父親結點。
判斷被插結點是其父親結點的左、右兒子。將被插結點做爲葉子結點插入。
若二叉樹爲空。則首先單獨生成根結點。算法
2.執行刪除結點算法
在二叉排序樹刪去一個結點,分三種狀況討論:
1.若結點爲葉子結點,即左子樹和右子樹均爲空樹。因爲刪去葉子結點不破壞整棵樹的結構,則能夠直接刪除此子結點。
2.若結點只有左子樹或右子樹,此時只要令或直接成爲其雙親結點的左子樹或右子樹便可,做此修改也不破壞二叉排序樹的特性。
3.若結點的左子樹和右子樹均不空。在刪去結點以後,爲保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,能夠:
令結點的直接前驅(或直接後繼)替代該結點,而後再從二叉排序樹中刪去它的直接前驅(或直接後繼)即讓結點的左子樹(若是有的話)成爲結點左子樹的最左下結點(若是有的話),再讓左子樹成爲結點的左右結點的父結點。數據結構
平衡二叉查找樹是帶有平衡條件的二叉查找樹。平衡條件:每一個節點的左子樹和右子樹的高度差最多爲1二叉查找樹(其中空樹的高度爲-1)
思想:
向平衡二叉樹中插入一個新結點後破壞了平衡二叉樹的平衡性。首先要找出插入新結點後失去平衡的最小子樹根結點的指針。而後再調整這個子樹中有關結點之間的連接關係,使之成爲新的平衡子樹。當失去平衡的最小子樹被調整爲平衡子樹後,原有其餘全部不平衡子樹無需調整,整個二叉排序樹就又成爲一棵平衡二叉樹。學習
假設因爲在二叉排序樹上插入結點而失去平衡的最小子樹根結點的指針爲a(即a是離插入點最近,且平衡因子絕對值超過1的祖先結點),則失去平衡後進行進行的規律可概括爲下列四種狀況:.net
LL型
平衡二叉樹某一節點的左孩子的左子樹上插入一個新的節點,使得該節點再也不平衡。這時只須要把樹向右旋轉一次便可,如圖所示,原A的左孩子B變爲父結點,A變爲其右孩子,而原B的右子樹變爲A的左子樹,注意旋轉以後Brh是A的左子樹(圖上忘在A於Brh之間標實線)
設計
RR型
平衡二叉樹某一節點的右孩子的右子樹上插入一個新的節點,使得該節點再也不平衡。這時只須要把樹向左旋轉一次便可,如圖所示,原A右孩子B變爲父結點,A變爲其左孩子,而原B的左子樹Blh將變爲A的右子樹。
指針
LR型
平衡二叉樹某一節點的左孩子的右子樹上插入一個新的節點,使得該節點再也不平衡。這時須要旋轉兩次,僅一次的旋轉是不可以使二叉樹再次平衡。如圖所示,在B節點按照RR型向左旋轉一次以後,二叉樹在A節點仍然不能保持平衡,這時還須要再向右旋轉一次。
調試
RL型
平衡二叉樹某一節點的右孩子的左子樹上插入一個新的節點,使得該節點再也不平衡。一樣,這時須要旋轉兩次,旋轉方向恰好同LR型相反。
htm
一、當插入的節點是根節點時,直接塗黑便可;
二、當要插入的節點的父節點是黑色的時候。
三、若是要插入的節點的父節點是紅色且父節點是祖父節點的左支的時候。
這個要分兩種狀況,一種是叔叔節點爲黑的狀況,一種是叔叔節點爲紅的狀況。
當叔叔爲黑時,也分爲兩種狀況,一種是要插入的節點是父節點的左支,另外一種是要插入的節點是父親的右支。
咱們先看一下當要插入的節點是父節點的左支的狀況:
這個時候違反了性質四,咱們就須要進行調整操做,使之符合性質四,咱們能夠經過對祖父節點進行右旋同時將祖父節點和父節點的顏色進行互換,這樣就變成了:
通過這樣的調整能夠符合性質四而且不對其餘性質產生破壞。
當插入的節點是父節點的右支的時候:
當要插入的節點是父節點的右支的時候,咱們能夠先對父節點進行左旋,變成以下:
若是咱們把原先的父節點看作是新的要插入的節點,把原先要插入的節點看作是新的父節點,那就變成了當要插入的節點在父節點的左支的狀況,對,是的,就是按照當要插入的節點在父節點的左支的狀況進行旋轉,旋轉完以後變成以下:
四、若是要插入的節點的父節點是紅色且父節點是祖父節點的右支的時候;
這個時候的狀況跟狀況3所表述的狀況是一個鏡像,將狀況3的左和右互換一下就能夠了。
五、若是要插入的節點的父節點是紅色而且叔叔節點也爲紅色,以下:
這個時候,只需將父親節點和叔叔節點塗黑,將祖父節點塗紅。
以上就是插入的所有過程。
無
正確使用Markdown語法(加1分)
模板中的要素齊全(加1分)
教材學習中的問題和解決過程, (加3分)
感想,體會真切的(加1分)
點評認真,能指出博客和代碼中的問題的(加1分)
這一週花了點心思在這一章上面,也好好閱讀了不少內容,掌握的還算能夠。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 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小時