樹
樹,這種結構在計算機領域應用非常廣泛,便于管理和查找。
樹的關鍵在與“分治”思想。我理解的分治思想就是將事務進行分類歸納,使得具有規律或者特征的來把數據或者事務聯系起來,這樣在查找或者使用的時候就可以有目的的忽略不需要浪費精力的部分,從而提高效率。
例如:文件系統(B+樹),DB索引(B+樹、哈希樹),treemap(紅黑樹),堆(完全二叉樹)
二叉樹
每個節點只有兩個子節點。
二叉查找樹,關鍵點是樹的深度。
堆結構就是一個完全二叉樹,(gc)。
二叉樹有很多種:紅黑樹,AVL樹,堆
AVL樹
1.本身首先是一棵二叉搜索樹。
2.帶有平衡條件:每個結點的左右子樹的高度之差的絕對值(平衡因子)最多為1。
堆
1、二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數
2、第 h 層所有的結點都連續集中在最左邊
紅黑樹
樹的旋轉
1、左旋
圖片引用http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html
2、右旋
圖片引用http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html
紅黑樹性質
1、任何一個節點都有顏色,黑色或者紅色
2、根節點是黑色的
3、紅節點的子節點必須為黑節點
4、任何一個節點向下遍歷到其子孫的葉子節點,所經過的黑節點個數必須相等
5、空節點被認為是黑色的
6、新插入節點所帶顏色為紅色,需要根據以上性質進行調整
二叉查找樹的遍歷、查找,還有基于兩者的排序、contain等方法的實現,對于所有的類型的二叉查找樹都是相同的。
插入
對于二叉查找樹的插入操作基本操作都是一樣的,都是先通過二分查找法找到所需要插入數據對應的位置,插入節點。關鍵的不同是:不同的查找樹在插入節點后,為了保持相應的性質所需進行的在平衡操作。
1、對于新節點的插入有如下三個關鍵地方:
(1)插入新節點總是紅色節點 。
(2)如果插入節點的父節點是黑色, 能維持性質 。
(3)如果插入節點的父節點是紅色, 破壞了性質. 故插入算法就是通過重新著色或旋轉, 來維持性質 。
由此得出:只有新插入節點的父節點為紅色節點的時候需要來進行調整。
2、紅黑樹插入
(1)(2)(3)
3、紅黑樹插入的再平衡操作
父節點為紅色節點的場景分析
(1)(2)(3)
刪除
刪除的過程也同插入操作,首先通過二分查找找到對應的節點,刪除后再平衡
1、將紅黑樹當作一顆二叉查找樹,將節點刪除。
(1) 被刪除節點沒有兒子(葉節點),直接將該節點刪除就OK了。
(2) 被刪除節點只有一個兒子,直接刪除該節點,并用該節點的唯一子節點頂替它的位置與被刪節點的父節點相連。
(3) 被刪除節點有兩個兒子,先找出它的后繼節點;然后把“它的后繼節點的內容”復制給“該節點的內容”;之后,刪除“它的后繼節點”。在這里,后繼節點相當于替身,在將后繼節點的內容復制給"被刪除節點"之后,再將后繼節點刪除。這樣就巧妙的將問題轉換為"刪除后繼節點"的情況了,下面就考慮后繼節點。 在"被刪除節點"有兩個非空子節點的情況下,它的后繼節點只可能是沒有兒子的葉節點或者只有一個右兒子。若沒有兒子,則按"情況① "進行處理;若只有一個兒子,則按"情況② "進行處理。
(1)(2)(3)(4)