新增entry時,核心函式fixafterinsertion原始碼如下:
具體圖示請分別參照 中的插入和刪除情形。
private void fixafterinsertion(entryx) else
//parent為red且parent的sibling為black,參照情形4
setcolor(parentof(x), black);
setcolor(parentof(parentof(x)), red);
rotateright(parentof(parentof(x)));
}} else else
setcolor(parentof(x), black);
setcolor(parentof(parentof(x)), red);
rotateleft(parentof(parentof(x)));}}
}root.color = black;
}刪除entry時,
private void fixafterdeletion(entryx)
if (colorof(leftof(sib)) == black &&
colorof(rightof(sib)) == black) else
//sib的右孩子為紅,和情形4對應;且上面情況必須導致這種情形。
setcolor(sib, colorof(parentof(x)));
setcolor(parentof(x), black);
setcolor(rightof(sib), black);
rotateleft(parentof(x));
x = root;
}} else
if (colorof(rightof(sib)) == black &&
colorof(leftof(sib)) == black) else
setcolor(sib, colorof(parentof(x)));
setcolor(parentof(x), black);
setcolor(leftof(sib), black);
rotateright(parentof(x));
x = root;}}
}setcolor(x, black);
}
TreeMap 紅黑樹 原始碼解析
紅黑樹是一種平衡二叉搜尋樹。它可以在o log n 的時間內完成查詢,插入和刪除。二叉搜尋樹 左邊的節點都小於父節點,右邊的節點都大於父節點。平衡二叉樹 任意左右兩個子樹的葉子節點的高度相差不超過1。關於二叉樹的分類可以看筆者的這篇文章 一句話弄懂常見二叉樹型別 分成這兩個概念來看,紅黑樹就非常好理...
TreeMap 原始碼分析
treemap底層是使用紅黑樹實現的儲存鍵值對的map容器,可以通過比較器進行排序。紅黑樹本質上是一棵弱平衡二叉樹,它的節點有紅色和黑色兩種顏色。主要特性有五點。1 每個節點或者是黑色,或者是紅色。2 根節點是黑色。3 每個葉子節點 nil 是黑色。注意 這裡葉子節點,是指為空 nil或null 的...
TreeMap原始碼分析
public v put k key,v value int cmp entryparent split comparator and comparable paths comparator cpr comparator if cpr null while t null else while t n...