メインパッケージ変更はのため のインポート「FMT」 //はgolang赤黒木 //追加ノードだけを達成し、層状の印刷機能ノード // REF:https://www.jianshu.com/p/e136ec79235c のconst( 赤= 1 ブラック2 = ) タイプstruct {ノード の右ノード*は *ノードの左の 親*ノード キーint型 の色のint } 型構造体を{rbtree ルートノード* メンバーの//数 LENのint } //を追加上の操作だけでリーフ発生した //ただ、SO無視しますオリジナル息子ノードの親APOS ISの//色は、Node常にレッド追加 FUNC(N- *ノード)addLeft(int型キー){ノードは、* =新新(ノード):追加 add.key =キー add.color =レッド add.parent = N n.left =追加 リターンアドオンを } //操作を追加し、葉の上にのみ発生し 、//これだけ親の元息子ノード無視 追加したノードの//色は常に赤です FUNC(N *ノード)addRight(キーINT)※ノード{ :新しい(ノード)=追加 add.key =キー add.color =レッド add.parent = N n.right =追加 戻り追加 } FUNC(RB * RBTree)rotateLeft(nは*ノード){ 親:= n.parent 右:= n.right n.right = right.left !場合right.left =ゼロ{ right.left.parent = N } right.left = N n.parent =右 もし親==ゼロ{ parent.right =左 right.parent =ゼロ rb.root =右 }他{ もしN == parent.left { parent.left =右 }他{ parent.right =右 } right.parent =親 } } FUNC(RB * RBTree)rotateRight(N *ノード){ 親:= n.parent 左:= n.left n.left = left.right !場合left.right =ゼロ{ left.right.parent = N } left.right = N n.parent =左 親== nilの場合{ left.parent =ゼロ rb.root =左 }他{ もしN == parent.left { parent.left =左 }他{ } left.parent =親 } } FUNC(RB * RBTree)の挿入(キーのint){ 場合rb.root == nilの{ rb.root =新しい(ノード) rb.root.key =キー rb.root.color =黒 }他{ P、[OK] := rb.find(キー) であればOK { // TODO置き換えるノード値 リターン } //ここでPゼロであってはならない 場合p.key>キー{ 追加:= p.addLeft(キー) rb.ajustAdd(アドオン) }他に{ 追加:= p.addRight(キー) rb.ajustAdd(アドオン) } } rb.len ++ } FUNC(RB * RBTree)ajustAdd(*ノードを追加する){ T:=追加 P:= add.parentを !pに対して= nilの&& p.color!=ブラック{ pが赤であるため、// PPはゼロであってはならない uncle.color =ブラック PP:= p.parent // GET叔父の 叔父:= pp.left 場合pp.left == P { 叔父= pp.right } 叔父==ゼロなら|| uncle.color ==ブラック{ もしP == pp.left { もしT == p.right { rb.rotateLeft(P) } rb.rotateRight(PP)、 他}、{ T == p.left {もし rb.rotateRight (P) } rb.rotateLeft(PP) } pp.color =レッド pp.parent.color =黒 ブレーク }他{ //叔父である必要があります赤 p.color =黒 pp.color =レッド トン= PP P =トン。親 } } もしP ==ゼロ{ rb.root = T rb.root.color =黒 rb.root.parent =ゼロ } } //第2のパラメータリターンtrueの場合、それが見つから示し キーが追加されることを親ノード//それ以外のリターンを FUNC(RB * RBTree)(キーint型)を見つける(*ノード、ブール値){ 場合rb.root == nilを{ 戻りはnil、偽 } C:= rb.root P:= C !Cのために= nilの{ c.key場合>キー{ P = C 、C = c.left }他c.key場合、<キー{ P = C 、C = c.right }他{ リターンC 、真 } } リターンP、偽 } POS = " //ちょうどデバッグのために FUNC(RB * RBTree)プリント(){ CH:=メイク(ちゃんインターフェース{}、1000) sync.WaitGroup WG VAR wg.Add(1) FUNC(){行く wg.Done延期を() varはint型dealed 用を{ 選択{ ケースV:= <-CH: もしN、OK:= V(*ノード)。OK { もしN ==ゼロ{ 続ける } ++ dealed 色:= "赤" n.color ==ブラック{もし 色= "黒" } POS:= "" であればn.parent ==ゼロ{ POS = "ルート" }そうであれば、N == n.parent.left { POS = "右" }そうであれば、N == n.parent.right { ならn.parent!=ゼロ{ fmt.Printf( "%D(P%dの、C%S、P%S)"、n.key、n.parent。キー、色、POS) }他{ fmt.Printf( "%のD(P%S、C%S、P%S)"、n.key、 ""、色、POS) } CH < - n.left CH < - n.right }他{ fmt.Println() もしdealed == rb.len { リターン } CH < - "次" } } } }() CH < - rb.root CH < - "次の" wg.Wait () } メイン(){FUNC RB:=新しい(RBTree) rb.insert(1) rb.insert(2) RB。挿入(3) rb.insert(4) rb.insert(5) RB。インサート(6) rb.insert(7) rb.insert(8) rb.insert(9) rb.insert(10) rb.insert(11) rb.insert(12) rb.insert(13) rb.print() }