先上**:
本人通過演算法導論對紅黑樹進行認識並根據書中的偽**實現乙個紅黑樹類。
首先紅黑樹是乙個相對平衡的二叉樹;比到正真的平衡二叉樹,他節省了用來維護平衡的開銷;在二叉搜尋樹的基礎上通過5條性質來約束,通過這樣約束的樹就是二叉搜尋樹。
第一:根節點是黑色;第二所有的葉子結點(其實只有乙個節點,該節點理解為哨兵)是黑色;第三,如果乙個節點是紅色,那麼他的孩子節點(們)必為黑色;第四,乙個節點只有一種顏色,要麼黑絲,要麼紅色;第五,從乙個節點出發的路徑到葉子節點(哨兵)的黑節點的數目相同,即黑高相同;對於紅黑樹的插入與刪除也是違背了這幾條性質,並圍繞這些性質進行修復。
插入:首先:對於插入紅色節點比插入黑色節點違背的性質要少,因此,插入黑色節點;其次插入操作是處理紅紅節點問題;為了能滿足整個樹是紅黑樹,大體思路是將該節點進行上移,直到根節點,最後將跟節點塗黑也不影響整個樹;但是在上移的過程中我們能通過旋轉與改變顏色盡快的調整為合法的紅黑樹;這樣更高效。
刪除:首先:刪除操作再刪除紅節點的時候,對整個樹沒有影響,不予考慮整個結果;其次,對刪除操作我們是將刪除點轉移到(或者本身就是)其直接後繼節點進行處理,這樣更試用所有的情況;第三,刪除操作是處理黑黑
問題,即刪除點是黑色,刪除後必然會違反紅黑樹的性質。(先寫到這兒,待補充)
紅黑樹的原理 關於紅黑樹原理的一些介紹
紅黑樹 red black tree 是一種重要的資料結構,也經常會用到,c 的map就是使用紅黑樹來實現的。在程式設計師找工作的面試中,紅黑樹也是經常被問到的乙個知識點,我也是當時從找工作的時候嘗試去理解紅黑樹的一些結構和原理,但是由於找工作時間比較緊張,而且要了解的知識點比較多,所以當時對它也沒...
關於實現紅黑樹的一些總結
一開始是打算照著 stl 寫的,結果發現乙個尷尬的情況 沒有allocator,std config.h,iterator,所以這個 rbtree1 就擱置了。後來 開始搞 rbtree2 又碰到了乙個很麻煩的問題。stl 原始碼裡面有乙個實現技巧 紅黑樹結點的結構是這樣的,還有乙個 templat...
關於紅黑樹的插入
滿足下面幾個條件的二叉搜尋樹,稱為紅黑樹 1.任何乙個節點都被著色 紅色或是黑色。2.根節點是黑色的。3.所有的nil 節點都看成黑色 nil 節點是就是乙個假想的或是無實在意義的節點,所有應該指向null 的 指標,都看成指向了nil 節點。包括葉節點的子節點指標或是根節點的父指標 4.如果乙個節...