1. 什麼是紅黑樹?
紅黑樹是一種自平衡的二叉查找樹:
- 節點要麼是黑色,要麼是紅色。
- 根節點爲黑色。
- 葉子節點都是黑色的空節點。(葉子節點不存儲數據)
- 紅色節點的左右孩子都是黑色。保證了從根節點到葉子節點不會出現連續兩個紅色節點。
- 從任意節點到它每個葉子節點的所有路徑,都包含相同數量的黑色節點。保證了沒有一條路徑會比其他路徑長出兩倍。
- 時間複雜度爲 logn ,含n個節點的紅黑樹高度最多爲 2log(n+1) 。
紅黑樹的左右旋:
左旋就是將這個旋轉節點作爲他右孩子的左孩子,原本他右孩子的左孩子作爲這個旋轉節點的右孩子 右旋就是將旋轉節點作爲他左孩子的右孩子,原本他左孩子的右孩子作爲這個旋轉節點的左孩子左旋右旋代碼
紅黑樹的應用
- HashMap(1.8)
- TreeMap
- IO多路複用 epoll 的實現採用紅黑樹組織管理的 sockfd,以支持快速的增刪改查;
2. 平衡二叉樹(AVL樹)
- 左右兩子樹高度差的絕對值不超過1,通過左右旋來維持平衡。
- 左右子樹也都是平衡二叉樹。
- 平衡二叉樹一定是二叉搜索樹,反之則不一定。
- 適合用於插入與刪除次數比較少,但查找多的情況。
- 時間複雜度爲 logn。
3. 紅黑樹與平衡二叉樹的區別?
- 平衡二叉樹要求兩子樹高度差的絕對值不超過1,對平衡要求的比較苛刻,所以需要複雜的左右旋操作來不斷的維持平衡;紅黑樹降低了對平衡的要求,從而提高了性能。
- 如果搜索的次數遠大於插入、刪除的次數,可以選擇AVL樹;如果搜索、插入和刪除的次數幾乎差不多,可以選擇紅黑樹。
- 如果數據頻繁的進行插入、刪除操作,使用平衡二叉樹的代價就有些高了。而只是做了近似平衡的紅黑樹,它的插入、刪除操作的性能都比較穩定,對於工程應用來說,會面對各種異常的情況,所以會更傾向於性能穩定的紅黑樹。