๐Ÿ“ข   ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ(Binary Search Tree)

  • ๋‚ด๋ถ€๋…ธ๋“œ์— (ํ‚ค,์›์†Œ)์Œ์„ ์ €์žฅํ•˜๋ฉฐ ๋‹ค์Œ์˜ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜๋Š” ์ด์ง„ํŠธ๋ฆฌ

    ์„ฑ์งˆ
    ํŠธ๋ฆฌ๋…ธ๋“œ u,v,w๊ฐ€ ์žˆ์„๋•Œ, u์™€ w๊ฐ€ ๊ฐ๊ฐ v์˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€ํŠธ๋ฆฌ์— ์กด์žฌํ•  ๋•Œ  Key(u) < Key(v) < Key(w) ์„ฑ๋ฆฝ

  • ์ „์ œ : ์ ์ •์ด์ง„ํŠธ๋ฆฌ๋กœ ๊ตฌํ˜„

 

[DS] ์ด์ง„ ํŠธ๋ฆฌ - binary tree (๊ฐœ๋… ๋ฐ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ข…๋ฅ˜)

ํŠธ๋ฆฌ Tree ๋Š” ์›์†Œ๋“ค์„ ๊ณ„์ธต์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋น„์„ ํ˜• non-linear ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. * ์œ„ ๊ทธ๋ฆผ์˜ ๋‚˜๋ฌด๋ฅผ ๋’ค์ง‘์–ด ๋‘” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์˜ ์›์†Œ ๋ฃจํŠธ root๋ฅผ ์ œ์™ธํ•œ ๊ฐ๊ฐ์˜ ์›์†Œ๋Š” ํ•˜๋‚˜์˜ ๋ถ€

sean-ma.tistory.com

  • ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„์ˆœํšŒ(Inorder Traversal)ํ•˜๋ฉด ํ‚ค๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค. 

 

[์ž๋ฃŒ๊ตฌ์กฐ] ํŠธ๋ฆฌ(Tree)์˜ ๊ฐœ๋… ๋ฐ ์ „์œ„์ˆœํšŒ, ์ค‘์œ„์ˆœํšŒ, ํ›„์œ„์ˆœํšŒ, ์ธต๋ณ„์ˆœํšŒ

์•ˆ๋…•ํ•˜์„ธ์š”! ใ…‹ใ…‹ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์•„์ง ํฌ์ŠคํŒ…ํ•  ์˜ˆ์ •์ด ์—†์—ˆ๋Š”๋ฐ ๋งคํ‹€๋žฉ ์ž๋ฃŒ๋ฅผ ์˜ฌ๋ฆฌ๋ ค๋‹ค ๋ณด๋‹ˆ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ๊ฐœ...

blog.naver.com

  • ์ด์ง„ํƒ์ƒ‰ ํŠธ๋ฆฌ ์˜ˆ

์ด์ง„ ํƒ์ƒ‰ํŠธ๋ฆฌ ์˜ˆ

 

๐Ÿ“ข   ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ํƒ์ƒ‰

  • Key๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด, ๋ฃจํŠธ์—์„œ ์ถœ๋ฐœํ•˜๋Š” ํ•˜ํ–ฅ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ ํ•œ๋‹ค.

  • ๋‹ค์Œ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๋Š” Key์™€ ํ˜„์žฌ ๋…ธ๋“œ์˜ Key์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•œ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๊ฒฐ์ •ํ•œ๋‹ค.

  • ์™ธ๋ถ€๋…ธ๋“œ(External Node, ๋ฆฌํ”„๋…ธ๋“œ(Leaf Node))์— ๋‹ค๋‹ค๋ฅด๋ฉด, ์ฐพ๋Š” Key๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค.

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ํƒ์ƒ‰( ๋ชฉํ‘œ Key = 7 )

 

๐Ÿ“ข   ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ์‚ฝ์ž…

  • ์šฐ์„  Key๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

  • Key๊ฐ€ ํ˜„์žฌ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์— ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๐Ÿ‘‰ ํƒ์ƒ‰์€ ์™ธ๋ถ€๋…ธ๋“œ(w๋กœ ๊ฐ€์ •)์— ๋„์ฐฉ

  • ๋„์ฐฉํ•œ ์™ธ๋ถ€๋…ธ๋“œ w์— Key๋ฅผ ์‚ฝ์ž…ํ•œ ํ›„ ๐Ÿ‘‰ ์ด ์™ธ๋ถ€๋…ธ๋“œ๋ฅผ ๋‚ด๋ถ€๋…ธ๋“œ๋กœ ํ™•์žฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.

  • ์—ฌ๊ธฐ์„œ ์™ธ๋ถ€๋…ธ๋“œ ๐Ÿ‘‰ Key๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š์€ ํŠธ๋ฆฌ์˜ ๋ง๋‹จ์— ์œ„์น˜ํ•œ ๋…ธ๋“œ
    ๋‚ด๋ถ€๋…ธ๋“œ ๐Ÿ‘‰ Key๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋…ธ๋“œ

Alg insertItem(K, E)		// ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ์‚ฝ์ž…
	input binary search tree T, Key K, element E
    output none

w <- treeSearch(root(),K)	// ์ผ๋‹จ, ์ด์ง„ํƒ์ƒ‰์œผ๋กœ, K๋ฅผ Key๊ฐ’์œผ๋กœํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ํ˜„์žฌ ์žˆ๋‚˜ ํƒ์ƒ‰
if(isInternal(w))			// ๋ฐ˜ํ™˜๋œ w๋…ธ๋“œ๊ฐ€ ๋‚ด๋ถ€๋…ธ๋“œ -> ์ด๋ฏธ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ๋‚ด์— ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ
	return			// ์‚ฝ์ž… ํ•  ํ•„์š” X -> ์ข…๋ฃŒ
else					// ์™ธ๋ถ€๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
	Set node w to (K, E)	// w๋…ธ๋“œ์˜ Key๊ฐ’์„ K, ์›์†Œ๋ฅผ E๋กœ ์ ์šฉํ•˜๊ณ 
    expandExternal(w)		// โ˜… ์ด w๋…ธ๋“œ๋ฅผ ๋‚ด๋ถ€๋…ธ๋“œ๋กœ ํ™•์žฅํ•œ๋‹ค.
    return
Alg expandExternal(z)
	input external node z
    output none

l <- getnode()
r <- getnode()
l.left <- Ø
l.right <- Ø
l.parent <- z
r.left <- Ø
r.right <- Ø
r.parent <- z
z.left <- l
z.right <- r
return

 

๐Ÿ“ข   ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ์‚ญ์ œ

  • ํฌ๊ฒŒ Case 1, Case 2๋กœ ๋‚˜๋‰œ๋‹ค. 

  • Case 1  ๐Ÿ‘‰  ์‚ญ์ œํ•  Key๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ์˜ ์–‘์ชฝ ์ž์‹ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์™ธ๋ถ€๋…ธ๋“œ์ผ ๊ฒฝ์šฐ
    Case 2  ๐Ÿ‘‰  ์‚ญ์ œํ•  Key๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ์˜ ์–‘์ชฝ ์ž์‹ ๋…ธ๋“œ ๋‘˜ ๋‹ค ๋‚ด๋ถ€๋…ธ๋“œ์ผ ๊ฒฝ์šฐ โ˜…

๐Ÿ“Œ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ์‚ญ์ œ ( Case 1. ์‚ญ์ œํ•  ๋…ธ๋“œ ์–‘์ชฝ ์ž์‹๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์™ธ๋ถ€๋…ธ๋“œ์ธ ๊ฒฝ์šฐ )

  • ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์–‘์ชฝ ์ž์‹ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์™ธ๋ถ€๋…ธ๋“œ์ผ ๊ฒฝ์šฐ์ด๋‹ค.

  • ์šฐ์„  ์‚ญ์ œํ•  Key๋ฅผ ํƒ์ƒ‰

  • Key๊ฐ€ ํŠธ๋ฆฌ์— ์กด์žฌํ•  ๊ฒฝ์šฐ, ํƒ์ƒ‰์€ Key๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ(w๋ผ ๊ฐ€์ •)์— ๋„์ฐฉ

  • ๋…ธ๋“œ w์˜ ์ž์‹ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์™ธ๋ถ€๋…ธ๋“œ(z๋ผ ๊ฐ€์ •)๋ผ๋ฉด, ๋…ธ๋“œ w์˜ ์ถ•์†Œ๊ณผ์ •์„ ํ†ตํ•ด, w, z๋ฅผ ํŠธ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์‚ญ์ œํ•œ๋‹ค.

Case 1. ์‚ญ์ œ( Key == 7 ) ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์–‘์ชฝ ์ž์‹๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€     ์™ธ๋ถ€๋…ธ๋“œ์ผ ๊ฒฝ์šฐ

๐Ÿ“Œ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ์‚ญ์ œ ( Case.2 ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์–‘์ชฝ ์ž์‹๋…ธ๋“œ๊ฐ€ ๋‘˜ ๋‹ค ๋‚ด๋ถ€๋…ธ๋“œ ์ผ ๊ฒฝ์šฐ ) โ˜…

  • ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์–‘์ชฝ ์ž์‹๋…ธ๋“œ ๋‘˜ ๋‹ค ๋‚ด๋ถ€๋…ธ๋“œ์ผ ๊ฒฝ์šฐ์ด๋‹ค. ( ์ด ๋•Œ ์‚ญ์ œํ•  ๋…ธ๋“œ๋Š” w๋ผ ๊ฐ€์ • )

  • 1. ํŠธ๋ฆฌ T์— ๋Œ€ํ•ด w์˜ ์ค‘์œ„์ˆœํšŒ ๊ณ„์Šน์ž y์™€ ๊ทธ ์ž์‹๋…ธ๋“œ z๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค.

    • ๋…ธ๋“œ y๋Š” ์šฐ์„  w์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์œผ๋กœ ์ด๋™ํ•œ ํ›„, ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ์™ผ์ชฝ ์ž์‹๋“ค๋งŒ์„ ๋๊นŒ์ง€ ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐ€๋ฉด ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ๋‚ด๋ถ€๋…ธ๋“œ์ด๋ฉฐ, ๋…ธ๋“œ z๋Š” y์˜ ์™ผ์ชฝ ์ž์‹์ธ ์™ธ๋ถ€๋…ธ๋“œ

    • y๋Š” T๋ฅผ ์ค‘์œ„์ˆœํšŒํ•  ๊ฒฝ์šฐ, ๋…ธ๋“œ w๋ฐ”๋กœ ๋‹ค์Œ์— ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋˜๋Š” ๋‚ด๋ถ€๋…ธ๋“œ์ด๋ฏ€๋กœ, w์˜ ์ค‘์œ„์ˆœํšŒ ๊ณ„์Šน์ž(Inorder successor)๋ผ ๋ถˆ๋ฆฐ๋‹ค.

    • ๋”ฐ๋ผ์„œ, y๋Š” w์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€ํŠธ๋ฆฌ ๋‚ด ๋…ธ๋“œ ์ค‘ ๊ฐ€์žฅ ์™ผ์ชฝ์œผ๋กœ ๋Œ์ถœ๋œ ๋‚ด๋ถ€๋…ธ๋“œ์ด๋‹ค.

  • 2. y์˜ ๋‚ด์šฉ์„ w์— ๋ณต์‚ฌ

  • 3. reduceExternal(z) ์ž‘์—…์„ ์‚ฌ์šฉํ•ด์„œ ๋…ธ๋“œ y์™€ z๋ฅผ ์‚ญ์ œ

Case 2. ์‚ญ์ œ(Key == 2) ์‚ญ์ œํ•  ๋…ธ๋“œ ์–‘์ชฝ์˜ ์ž์‹๋…ธ๋“œ๊ฐ€ ๋‚ด๋ถ€๋…ธ๋“œ์ธ ๊ฒฝ์šฐ

Alg removeElement(K)
	input binary search tree T, Key K
    output element with Key K

W <- treeSearch(root(),K)

// Key K๋ฅผ ๊ฐ€์ง€๋Š” T๋‚ด์— ์ฐพ์€ w๋…ธ๋“œ๊ฐ€ ์™ธ๋ถ€๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
if(isExternal(W))
	return NoSuchKey

// Key K๋ฅผ ๊ฐ€์ง€๋Š” T๋‚ด์— ์ฐพ์€ W๋…ธ๋“œ๊ฐ€ ์™ธ๋ถ€๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
e <- element(W)
z <- leftChild(W)

if(!(isExternal(z))
	z <- rightChild(W)

if(isExternal(z))						// Case 1. ์‚ญ์ œํ•  W๋…ธ๋“œ์˜, ์–‘์ชฝ ์ž์‹๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์™ธ๋ถ€๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
	reduceExternal(z)
else								// Case 2. ์‚ญ์ œํ•  W๋…ธ๋“œ์˜, ์–‘์ชฝ ์ž์‹๋…ธ๋“œ ๋‘˜ ๋‹ค ๋‚ด๋ถ€๋…ธ๋“œ์ธ ๊ฒฝ์šฐ โ˜…
	y <- inOrderSucc(W)				// W์˜ ์ค‘์œ„์ˆœํšŒ๊ณ„์Šน์ž( ์ฆ‰, W๋…ธ๋“œ์˜ Key๊ฐ’ ๋ฐ”๋กœ ๋‹ค์Œ์œผ๋กœ ํฐ, Key๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ ), y
    z <- leftChild(y)					// ์ค‘์œ„์ˆœํšŒ๊ณ„์Šน์ž y๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ๊ฐ€ z
    Set node W to (Key(y),element(y))		// ์‚ญ์ œํ•œ๋‹ค๋Š” ๊ฐœ๋…์œผ๋กœ, ์‚ญ์ œํ•  W๋…ธ๋“œ์˜ key๊ฐ’๊ณผ element๊ฐ’์„ y์˜ Key,element๋กœ ๋ณ€๊ฒฝ
	reduceExternal(z)				// y์— ๋Œ€ํ•ด, ๋‚ด๋ถ€๋…ธ๋“œ ์ถ•์†Œ๊ณผ์ •

return e

 

๐Ÿ“ข   ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ์„ฑ๋Šฅ

  • ๋†’์ด h์˜ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ N ํ•ญ๋ชฉ์˜ ์‚ฌ์ „์„ ๊ฐ€์ •ํ•ด๋ณด์ž.

  • O(N) ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ํƒ์ƒ‰,์‚ฝ์ž…,์‚ญ์ œ ์ž‘์—… ๋ชจ๋‘ O(h)์‹œ๊ฐ„์— ์ˆ˜ํ–‰

  • ๋†’์ด h๋Š”

    1. ์ตœ์•…์˜ ๊ฒฝ์šฐ  ๐Ÿ‘‰  O(N) 

    2. ์ตœ์„ ์˜ ๊ฒฝ์šฐ  ๐Ÿ‘‰  O(log(N))

์ตœ์•…์˜ ๊ฒฝ์šฐ = O(N)
์ตœ์„ ์˜ ๊ฒฝ์šฐ = O(log(N))

 

๐Ÿ“ข   ์ฐธ๊ณ  

  • ๋™์ผํ•œ ํ‚ค ์ง‘๋‹จ์œผ๋กœ ์ƒ์„ฑ๋œ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์—์„œ, ์‚ฝ์ž… ์ˆœ์„œ์™€๋Š” ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๋™์ผํ•œ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค ?๐Ÿ‘‰  NO !!

  • ๊ฐ„๋‹จํ•œ ์˜ˆ๋กœ ํ™•์ธ๊ฐ€๋Šฅ ๐Ÿ‘‰ [ 9,5,12,7,13 ] ์ˆœ์„œ์™€ [ 9,7,12,5,13 ] ์ˆœ์„œ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ๋ชจ์–‘์€ ๋‹ค๋ฅด๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•

'Algorithm Theory' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๊ทธ๋ž˜ํ”„(Graph)  (0) 2020.12.13
ํ•ด์‹œํ…Œ์ด๋ธ”(Hash Table)  (0) 2020.12.13
์‚ฌ์ „(Dictionary)  (0) 2020.12.12
ํž™๊ณผ ํž™์ •๋ ฌ ( Heap & Heap Sort )  (0) 2020.09.26
์šฐ์„ ์ˆœ์œ„ ํ(Priority queue)  (0) 2020.09.24

+ Recent posts