HashMap之TreeNode(红黑树)源码分析
HashMap-TreeNode源碼分析(jdk1.8
- HashMap之TreeNode源碼分析
- 屬性及構造方法
- find()
- putTreeVal()
- removeTreeNode()
- treeify()
- untreeify()
- balanceInsertion()
- balanceDeletion()
- rotateLeft() 左旋
- rotateRight() 右旋
- moveRootToFront()
- checkInvariants()
HashMap之TreeNode源碼分析
首先,TreeNode不僅是紅黑樹,還是鏈表。繼承了LinkedHashMap.Entry,而Entry繼承了 HashMap.Node如下圖
屬性及構造方法
各屬性的含義見下圖
find()
根據key和key class查找節點,從當前節點開始,大于找右子樹,小于找左子樹。
putTreeVal()
給樹添加一個節點,添加之后進行平衡操作balanceInsertion(),平衡之后需要確保在數組中的是根節點moveRootToFront()
removeTreeNode()
刪除一個節點, 刪除前進行一系列的判斷(空、長度等)詳見注釋。
對于紅黑樹節點的刪除,可以理解為:找一個替換節點(大于當前節點的最小節點),替換節點與要刪除的節點位置交換,刪除節點就到了替換節點的位置上,其實刪除的節點應該是替換節點。刪除后會調用刪除后不一定滿足紅黑樹的性質。調用balanceDeletion(),進行刪除平衡。
treeify()
根據鏈表生成樹,其實就是遍歷鏈表,一個一個往紅黑樹里插入。插入后調用balanceInsertion(),插入后的平衡,詳見代碼注釋
untreeify()
紅黑樹轉鏈表,此方法要簡單的多。
balanceInsertion()
此方法為為紅黑樹插入后的平衡,紅黑樹插入的邏輯也主要集中在此方法中。其中調用了rotateLeft()左旋,rotateRight()右旋方法可參考下方圖片理解紅黑樹插入情景。
圖片地址:https://www.processon.com/view/link/5dd5fc33e4b0f8a5c6e3e1b1
balanceDeletion()
刪除后的平衡操作,其實就是各種情況的分析。
rotateLeft() 左旋
左旋,進行左旋的是,當前節點和他的右節點(可以參考圖片)
右節點取代當前節點的位置(12到了5的位置上)
變為右節點的左節點(5下移了一級)
右節點的左節點變為當前節點的右節點(7變為5的右節點)
rotateRight() 右旋
右旋,進行右旋的是,當前節點和他的左節點(可參考圖片)
左節點取代當前節點的位置(12到了19的位置上)
變為左節點的右節點(19下移了一級)
左節點的右節點變為當前節點的左節點(13變為19的左節點)
moveRootToFront()
看名字就知道是這個方法是干什么move root to front(移動root節點到前面)。移動之后會確認下當前數據結構是否符合紅黑樹性質checkInvariants()。
checkInvariants()
總結
以上是生活随笔為你收集整理的HashMap之TreeNode(红黑树)源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下实现BPG压缩以及解压缩
- 下一篇: *312戳气球