上節說了,HashMap存儲的時候,如果鏈表的長度過長,就會將鏈表轉換成紅黑樹,那么對紅黑樹有什么理解呢?
1.每個節點非紅即黑。
2.根節點總是黑色的。
3.如果節點是紅色的,那么它的子節點必須是黑色的(反之不一定)。
4.每個葉子節點都是黑色的空節點(NIL節點)。
5.從根節點到葉節點或空節點的每條路徑,必須包含相同數目的黑色節點(即相同的黑色高度)。
想到這里,又有了問題,既然使用紅黑樹是可行的,為什么不一直使用紅黑樹呢?
我們知道,紅黑樹屬於平衡二叉樹,為了保持平衡是需要付出代價的,但是該代價所損耗的資源要比遍歷線性鏈表要少,所以長度大於8的時候會使用紅黑樹,而當鏈表長度很短時,遍歷鏈表的速度要更快一點,所以為了效率的提高,不會一直使用紅黑樹。
那么,拉鏈法導致的鏈表過深,為什么不適用二叉樹來代替呢?
這是因為二叉查找樹有缺陷:二叉查找樹在特殊情況下會變成一條線性結構,遍歷查找會非常慢。而紅黑樹在插入新數據后可能需要通過左旋,右旋,變色這些操作來保持平衡,而我們是為了解決鏈表查詢深度的問題,引入紅黑樹就是為了查找數據快,因此選擇紅黑樹來替換過長的鏈表。