素早く見つけると、バイナリツリー、各ノード一つだけの要素(値またはキーと値のペア)、左のサブツリー内のすべてのノードの値である健康は、あまり親ノードの値よりもあるのために二分探索木、右部分木の値のすべて親ノードの値よりも大きいが、左右のサブツリーは二分探索木、無ノードと等価のキーです。検索、挿入、削除時の複雑さは、所望の値はO(Nログ)であり、ツリーの高さの両方に比例することです。
アレイは、】【に挿入露出に二分探索木を欠点であるとしてではなく、二分探索木は、線形テーブルルックアップの時間複雑度はO(N)の最悪時の複雑さに到達縮退します。
アニメーション:二分探索木は線状に分解し
何挿入および欠失がないこと(長さが等しいパスのそのリーフノードのいずれか一ノード)ツリーの完璧なバランスを保つことができますか?
そこでは、Bツリー。Bツリーは同じ高さであるパスのリーフノードにルートノードからバランスのとれたツリーであり、(順序付けられたデータシーケンスをトラバースすることによって得ることができる)順序付けられたデータを維持することが可能です。Bツリーのノードが2つ以上のサブ木、例えば2-3のような木、偶数2-3-4-5-6-7-8 2-3-4ツリーのツリーを有することができ、それらは、二分探索木の特性を満たすが、彼らは、バイナリツリー、また、バイナリ検索ツリーに属していません。
完璧なバランス2-3-4ツリー、リーフノードの高さにルートから各パスは同じです
2-3-4ツリーには、次のノードがあります。
2-ノードは、要素(またはキーと値のペア)と、2つのサブツリーを含む、すべての値が少ない親ノードの左サブツリーの値よりも、全ての値は、親ノードの右サブツリーの値よりも大きくされている(サブツリーが左右しました)。
3-ノードは、二つの要素、および3つのサブツリーを備え、左の部分木の全ての値は、以下の親要素の最小値よりも、すべてのサブツリーの値は右サブツリーの全ての値は、親ノードの2つの要素間の中間に配置されています親要素の最大値よりも大きいです。
3および4の要素との間の比較を含む4ノードは、ノードの特性はまた、二分探索木を満たすサブツリー。
2-3-4木探索アルゴリズム
2-3-4ツリーは似た二分探索木を見つけて下さい。
2-3-4ツリー挿入アルゴリズム
2-3-4ツリー挿入アルゴリズムは、現在のノードが4ノードで除去することで、ノードは、4- [2-ノード、中間ノード2の複数に分解して親ノード3-又は4つのノードにマージ。
沿って4節リンクダウンに、両方の場合に分解を形質転換:
1)4-ノードをルートノードとして、ノードは、2- 3にルートノード2などの中間ノードを分解する。
2)現在のノードは、4ノードである-2- 3つのノード、中間ノード2に分解し、親ノード3-又は4つのノードにマージ。
図:リンク、4ノードの分解をダウン変換
左右に沿ってダウンリンクを変換しながら、検索にヒットします。要素は、ケースの鍵である場合、古い値へのヒットのための外観は、新しい値に割り当てられている、あなたが繰り返し要素のサポートが必要な場合は、要素が値であれば二分探索木は全く同じ要素を満たしていないする必要があるため、その後、ヒットのための外観は、それを無視します、要素オブジェクト数属性に追加し、デフォルトは1です。
検索の失敗した場合、それはリーフ・ノードへの要素の上に挿入されます。挿入ノードおよび3- 2-ノードの挿入:ツリーの下に要素を挿入することは2つだけの場合です。
図:ツリーの下に要素を挿入します
2-3-4木の剪定ばさみ
削除2-3-4ツリーアルゴリズムは、現在のノードが来る親または兄弟による2ノード、ノード要素で除去することです。
最小の要素を削除します。
ルートノードの左の子を開始し、3例に分けることができ、左のリンクに沿って下方に変換します。
現在のノードが2ないノード1)、スキップ。
2)現在のノードがノード2-ノードの兄弟は2であり、そして合わせた現在のノードであり、最小の要素ノードと兄弟ノードの親ノードが4であり、現在のノードの4ノードに変換されます。
3)現在のノードがノードの兄弟は、最小要素の兄弟ノードの親ノードを移動させるための最小要素2ない、ノード2-、現在のノードの親ノードが移動され、現在のノードが3ノードに変換されます。
図:左のリンクをダウン変換します
最大の要素を削除します。
ルートノードの右の子を開始し、右のリンクに沿って変換ダウンも3例に分かれています。
現在のノードが2ないノード1)、スキップ。
2)現在のノードが兄弟ノードが2である、2-ノードであり、そして合わせた最大の要素と現在のノードの兄弟は、4ノードは、現在のノードが4ノードに変換された親ノードです。
3)現在のノードがノード2-ノードが2ではない兄弟、最大要素の兄弟ノードが親ノードの最大要素に移動し、現在のノードの親ノードが移動し、現在のノードが3ノードに変換されます。
図:右のリンクダウン変換
任意の要素を削除します。
最小の要素を削除し、最大の要素アルゴリズムを削除する、自然のアルゴリズムのいずれかの要素を削除学んだ後は簡単です。それがヒットを見つけることができれば、見つけるためにヒットする任意の要素アルゴリズムのニーズを削除し、その後、右部分木の最小値が削除される要素を置き換え、最小の要素を削除するには、右部分木アルゴリズム。
2-3-4木の自然が出会うバイナリ検索ツリーが、しかしそれは、二分探索木ではありません。それは、二分探索木で、所望であれば、ノード2-ノードの複数の3-および4-ノードを交換する必要があるだけでなく、(赤リンクによって示されている)要素間の関係を示しています。
あるいは4ノードとノード3-
図:の代わりに3-ノード
図4-ノードを交換
但是存在一个问题,2-3-4树因为3-节点的不同表示会有很多种不同的红黑树,3-节点既可以左倾,也可以右倾。所以为了保证树的唯一性,3-节点只考虑左倾,当然你也可以只考虑右倾。
这样对于任何一颗2-3-4树,只考虑左倾的情况下,都能得到唯一的一颗对应的红黑树,这种树也叫左倾红黑树,相对比较减少了复杂性,设计更容易被实现。
红黑树查找算法
红黑树的查找算法和二分搜索树一样。
关于链接的颜色变换只跟颜色转换有关,而旋转不会改变链接的颜色变换,只在被红链接指向的节点变成红色,被黑链接指向的节点变成黑色。
旋转
旋转是将不满足红黑树性质的3-节点和4-节点进行旋转,如果3-节点出现右链接,则将右链接通过左旋转变成左链接;如果4-节点出现一个红节点连着两条红链接,则将4-节点配平。
左旋转
图:左旋转
右旋转
图:右旋转
图:3-节点和4-节点的旋转
Code:右旋转和左旋转
颜色转换
颜色转换只应用于4-节点。
图:颜色转换
Code:颜色转换
红黑树插入算法
回顾之前的2-3-4树的插入算法,它有两个过程:沿着链接向下进行分解4-节点和树底下插入一个元素。
红黑树的插入算法和2-3-4树的插入算法类似,它不仅包含前面两个过程,还增加了向上进行变换的过程,此过程是将3-节点左倾和4-节点配平。
红黑树插入算法会先从根节点开始,沿着左右链接向下进行变换,目的是为了分解4-节点。如果该节点的左右孩子都是红节点,则通过flipColors方法进行颜色转换,接着进行下一个子节点;如果不是,则直接进行下一个子节点。
到达树底的时候,则意味着可以开始插入新的元素。
如果红黑树目前是一颗空树,插入红色的元素作为第一个节点,然后该节点变成黑色。如果不是一颗空树,插入元素分为三种情况:向2-节点插入新元素、向3-节点插入新元素和向4-节点插入新元素。
向2-节点插入新元素
向2-节点插入新元素很简单,如果新元素的值小于父节点,直接插入红色的节点即可;如果新元素的值大于父节点,则产生一个红色右链接,插完之后则将3-节点进行左旋转,将右链接变成左链接,被红链接指向的节点变成红色,被黑链接指向的节点变成黑色。
图:向2-节点插入新元素
向3-节点插入新元素
因为前面的3-节点进行过旋转,此时的3-节点肯定满足左倾红黑树的性质。向3-节点插入新元素分为三种情况:
1)新元素的值位于3-节点中的两元素之间;
2)新元素的值小于3-节点中的最小元素;
3)新元素的值大于3-节点中的最大元素。
图:向3-节点插入新元素
##### 向4-节点插入新元素
向4-节点插入新元素之前需要先进行颜色转换,才可以进行插入新的元素。
图:向4-节点插入新元素
插完新元素之后需要满足红黑树的性质,则在沿着父节点的链接向上进行变换,具体做法和向3-节点插入新元素的做法类似,通过左旋转将3-节点左倾和左右旋转将4-节点配平,没有颜色转换。
动画:2-3-4树与红黑树的插入
Code:红黑树插入算法
红黑树删除算法
红黑树删除算法也需要进行旋转和颜色转换操作,在插入算法中为了待插入元素所在的节点不是4-节点,所以在沿着左右链接向下进行变换时将4-节点分解成3个2-节点,中间的2-节点与父节点合并;而在删除算法中为了待删除元素所在的节点不是2-节点,所以在沿着左右链接向下进行变换时将2-节点向其它不是2-节点的节点(兄弟节点或父节点)借一个元素过来,合并成3-节点。
所以,只要是2-节点的节点,如果兄弟节点不是2-节点,就将兄弟节点的与父节点邻近的元素移到父节点,而父节点将与当前节点邻近的元素移到当前节点;如果兄弟节点是2-节点,则将父节点的与当前节点邻近的元素移到当前节点。(是不是很绕?待会在后面删除最值算法中详细给出)
然后删除完一个元素之后需要进行修复调整,将这个树满足红黑树的性质。如果右链接是红色,将右链接通过左旋转变成左链接;如果有连续的左链接,通过右旋转配平,然后进行颜色转换。
Code:向上变换(修复调整)
删除最小元素
删除最小元素算法和二分搜索树一样,一直递归它的左孩子,直到它的左孩子为空才进行删除这个最小元素。但是红黑树在递归的同时如何旋转和颜色转换是个问题。
删除最小元素算法一直沿着左链接向下进行转换,对照2-3-4树,我们可以给出三种情况,从根节点开始:
1)当前节点(父节点位置)的左子节点不是2-节点,直接进行下一个节点(左子节点);
2)当前节点的左子节点和右子节点都是2-节点,则将左子节点、当前节点的最小元素和右子节点合并成4-节点,然后进行下一个节点;
3)当前节点的左子节点是2-节点,右子节点不是2-节点,则将右子节点的最小元素移到当前节点的位置,当前节点的最小元素移到左子节点,然后进行下一个节点。
图:沿着左链接向下进行转换
Code:沿着左链接向下变换
直到某元素左孩子为空的时候,此时的元素是这个树的最小元素。因为通过前面的转换,最小元素肯定被一个红链接指向,删除这个元素之后通过balance方法修复调整为红黑树。
Code:删除最小元素算法
删除最大元素
删除最大元素算法和删除最小元素算法类似的,也分为三种情况:
1)当前节点(父节点位置)的右子节点不是2-节点,直接进行下一个节点(右子节点);
2)当前节点的右子节点和左子节点都是2-节点,则将右子节点、当前节点的最大元素和左子节点合并成4-节点,然后进行下一个节点;
3)当前节点的右子节点是2-节点,左子节点不是2-节点,则将左子节点的最大元素移到当前节点的位置,当前节点的最大元素移到左子节点,然后进行下一个节点。
图:沿着右链接向下进行变换
Code:沿着右链接向下变换
Code:删除最大元素算法
删除任意元素
学习过前面的删除最小元素算法和删除最大元素算法,删除任意元素会变得很简单。删除最小元素算法会一直沿着左链接向下进行变换,删除最大元素算法会一直沿着右链接向下进行变换,而删除任意元素算法需要同时存在着左右链接向下进行变换。
削除右部分木、ヒットが右のサブツリーの削除要素の中で最小の要素を交換するでしょう場合はヒットを探している過程で、左右のリンクに沿って下方に変換されます、見つけるためにヒットする任意の要素アルゴリズムのニーズを削除します。最小要素アルゴリズム、ルックアップがミスした場合、関数は直接上方3-または4-ノードnodeトリムを左バランスを返します。
コード:任意の要素アルゴリズムを削除します。
アニメーション:赤黒木と削除] 2-3-4ツリー
上記の学習アルゴリズムの完了後赤黒木の特性の下に要約することができます。
1)各ノードまたは赤、または黒。
2)ルートノードは黒です。
3)各リーフ(NIL)は黒です。
ノードが赤色の場合4)、その2つのつの子ノードは、ブラック(NILノード)も黒です。
5)各ノードについて、ノードからその子孫リーフノードの全てへの単純なパスは、黒ノード(リンクされたブラックバランス)の同じ数を含みます。
この記事のように、国民の関心番号「アルゴリズムの痛み」に腕時計に、よりエキサイティングなコンテンツを歓迎