在上一節的學習中不難發現,二叉樹節點增減後,其結構可能會發生左右子樹不平衡的問題,導緻其查找效率大打折扣。本節将為讀者介紹紅黑樹的概念及其對于二叉樹來說增加的内容與節點規則。
【本節目标】
通過閱讀本節内容,你将進一步認識二叉樹,對其簡單的節點增減工作帶來的“後遺症”有一個明确的認識,了解到紅黑樹的基本概念與其節點結構的特點,初步了解其能夠實作二叉樹的調整平衡的方法。
紅黑樹原理分析
通過整個二叉樹的實作相信已經可以清楚二叉樹的主要特點:資料查詢的時候可以提供更好的查詢性能,但是這種原始的二叉樹結構是有明顯缺陷的,例如,當二叉樹結構改變的時候(增加或删除)就有可能出現不平衡的問題。
傳統二叉樹問題
之前所謂的解決二叉樹性能問題的方式最終全部都變為了null,也就是說如果要想要達到最良好效果的二叉樹,那麼它首先是一個平衡二叉樹,同時所有節點的層次深度都應該相同。
均衡二叉樹
如果所有的資料按照以上的結構進行儲存,那麼二叉樹的檢索操作執行效率一定是最高的,可是樹就需要忍受住頻繁的增加或者是删除操作,是以針對于二叉樹有了進一步的要求。
紅黑樹本質上是一種二叉查找樹,但它在二叉查找樹的基礎上額外添加了一個标記(顔色),同時具有一定的規則。這些規則使紅黑樹保證了一種平衡,插入、删除、查找的最壞時間複雜度都為“O(logn)”。
紅黑樹是在1972年由Rudolf Bayer發明的,當時被稱為平衡二叉B樹(symmetric binary B-trees)。後來,在1978年被Leo J.Guibas和Robert Sedgewick修改為如今的“紅黑樹”。
紅黑樹的本質就是在節點上追加了一個表示顔色的操作資訊而已。
enum Color{
RED,BLACK;
}
class BinaryTree<T> {
private class Node {
private T data;
private Node parent;//父節點
private Node left;//左子樹
private Node right;//右子樹
private Color color;//節點顔色
}
}
class BinaryTree<T> {
private class Node {
private T data;
private Node parent;//父節點
private Node left;//左子樹
private Node right;//右子樹
private boolean color;//節點顔色
}
}
對于Node節點中的顔色标記可以使用true或false來實作,不一定非要使用枚舉類。
一個标準的紅黑樹的結構如下所示:
紅黑樹基本結構
紅黑樹特點(規則)
1、每個節點或者是黑色,或者是紅色;
2、根節點必須是黑色;
3、每個葉子節點是黑色;
|- Java實作的紅黑樹将使用null來代表空節點,是以周遊紅黑樹時将看不到黑色的葉子節點,反而看到每個葉子節點都是紅色的;
4、如果一個節點時紅色的,則它的子節點必須是黑色的;
|- 從每個根到節點的路徑上不會有兩個連續的紅色節點,但黑色節點是可以連續的。若給定黑色節點的個數N,最短路徑情況是連續的N個黑色,樹的高度為N-1;最長路徑的情況為節點紅黑相間,樹的高度為2(N-1);
5、從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點數量;
|- 成為紅黑樹最主要的條件,後序的插入、删除操作都是為了遵守這個規定;
紅色節點之後絕對不可能是紅色節點,但是沒有說黑色節點之後不允許是黑色節點,允許黑-黑連接配接。
主要是利用紅色節點與黑色節點實作均衡控制。簡單點了解紅黑樹的結構就是為了可以進行左旋和右旋控制以保證樹的平衡性。
紅黑存在的意義
但是對于平衡性,還需要考慮資料增加的平衡以及資料删除的平衡,增加和删除都是需要對樹進行平衡修複。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:使用紅黑樹實作節點增減的平衡修複 | 帶你學《Java語言進階特性》之四十二 更多Java面向對象程式設計文章檢視此處