golang红黑树

メインパッケージ変更はのため

のインポート「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()
}

  

おすすめ

転載: www.cnblogs.com/yanbiao/p/12596208.html