BST (์ด์ง ํ์ ํธ๋ฆฌ)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ Tree.
๊ฐ ๋
ธ๋๋ ๊ฐ(key)๋ง๊ณ ๋ ์์ ๊ฐ๊ณ ์์ ๋ ๋ or ๋ธ๋ 2์ข
๋ฅ๋ค.
1. Root Property : ๋ฃจํธ(root)๋
ธ๋๋ ๋ธ๋(black)์ด๋ค.
2. External Property : ๋ชจ๋ ์ธ๋ถ ๋
ธ๋ (external node)๋ ๋ธ๋์ด๋ค.
3. Depth Property : ๋ชจ๋ ๋จ๋ง ๋
ธ๋(leaf node)์ ๊ฒฝ์ฐ ๋ฃจํธ๋ถํฐ ์ธ๋ถ ๋
ธ๋ ๊น์ง ๋ฐฉ๋ฌธํ๋ ๋ธ๋ ๋
ธ๋์ ์๊ฐ ๊ฐ๋ค.
4. Internal Property : ๋นจ๊ฐ ๋
ธ๋์ ์์์ ๋ธ๋์ด๋ค.
== No Double Red :๋ ๋ ๋
ธ๋๋ ๋๊ฐ๊ฐ ์ฐ์ํด์ ์ฌ ์ ์๋ค.
์ฅ์ (ํด์ฌ์ ๋น๊ตํด์)
BST ํน์ง๋๋ก ์ฝ์
ํ, ์ฝ์
๋
ธ๋์ ์๊น์ RED๋ก ์ค์ .
์ฝ์
ํ RBT์ ํน์ง์ ์๋ฐฐํ ์ ๋
ธ๋์ ์๊น์ ์กฐ์ ํ๊ณ ,
Black-Height๊ฐ ์๋ฐฐ๋์๋ค๋ฉด, rotation์ ํตํ์ฌ height์ ์กฐ์ .
์ด๋, ์ฌ๋ฌ case๊ฐ ์กด์ฌํ๋ ๋ฐ, ์๋ก ์ฝ์
ํ ๋
ธ๋๋ฅผ z๋ผ๊ณ ํ ๋,
๋ถ๋ชจ ๋
ธ๋์ธ p[z]๊ฐ ๋ถ๋ชจ ๋
ธ๋์ ๋ถ๋ชจ ๋
ธ๋์ธ ํ ์๋ฒ์ง ๋
ธ๋ p[p[z]]์ ์ผ์ชฝ ์์์ธ์ง ์ค๋ฅธ์ชฝ ์์์ธ์ง์ ๋ฐ๋ผ case๊ฐ ๋๋๊ฒ ๋๋ค.
๋๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์๋ก ๋์นญ์ด๋ค.
red-black tree๊ท์น์ด ์๋ฐฐ๋ ๋ ํฌ๊ฒ ๋ณด๋ฉด ์๋์ ๊ฐ์ด 2๊ฐ์ง์ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค.
๐ด case 1 : z ์ผ์ด์ด ๋ ๋ โก ์์ ๋ณํ ( Recoloring )
- z์ ๋ถ๋ชจ์ z์ ์ผ์ด ๋
ธ๋๋ฅผ ๋ ๋์์ ๋ธ๋์ผ๋ก ๋ฐ๊พธ๊ณ , z์ ํ ์๋ฒ์ง ๋
ธ๋๋ฅผ ๋ธ๋์์ ๋ ๋๋ก ๋ฐ๊พผ๋ค.
- z์ ํ ์๋ฒ์ง ๋
ธ๋์ ๋ถ๋ชจ๋
ธ๋๊ฐ ๋ ๋์ธ ๊ฒฝ์ฐ ์ด ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ณต ํ๋ค.
- z์ ๋ถ๋ชจ๊ฐ ๋ธ๋์ ๋ง๋ ๋ ์ข
๋ฃ ๋๋ฉฐ, ๋ฃจํธ๊น์ง ์ฌ๋ผ๊ฐ๊ฒ ๋๋ฉด ๋ฃจํธ๋
ธ๋๋ฅผ ๋ธ๋์ผ๋ก ๋ฐ๊พธ๊ณ ์ข
๋ฃํ๋ค. (๋ฃจํธ๋
ธ๋๊น์ง ์ฌ๋ผ๊ฐ๊ฒ ๋๋ฉด black-height๋ 1 ์ฆ๊ฐํ๊ฒ ๋๋ค.)
๐ด case 2 : z์ ์ผ์ด์ด ์๊ฑฐ๋ ๋ธ๋ โก ํ์ ( rotation , restructuring)
๐ธ ๋ถ๋ชจ๋
ธ๋ (p[z])๊ฐ ํ ์๋ฒ์ง ๋
ธ๋ (p[p[z]]) ์ ์ผ์ชฝ ์์์ผ๋
โพ case 2-1 : z๊ฐ p[z]์ ์ค๋ฅธ์ชฝ ์์
- p[z]๋ฅผ ์ค์ฌ์ผ๋ก ์ผ์ชฝ์ผ๋ก ํ์ ์ํค๊ณ , ์ฌ์ ํ ๋ ๋ ๋ธ๋ํธ๋ฆฌ ํน์ฑ์ ์๋ฐํ๋ฏ๋ก case 2-2๋ฅผ ์ํํ๋ค.
โพ case 2-2 : z๊ฐ p[z]์ ์ผ์ชฝ ์์
- p[p[z]]๋ฅผ ์ค์ฌ์ผ๋ก ์ค๋ฅธ์ชฝ ํ์ ์ํค๊ณ , p[z]์ p[p[z]]์ ์์์ ๋ฐ๊พผ๋ค.
(๋ถ๋ชจ๋
ธ๋๋ ๋ธ๋์ผ๋ก, ํ ์๋ฒ์ง ๋
ธ๋๋ ๋ ๋๋ก)
๐ธ ๋ถ๋ชจ๋
ธ๋ (p[z])๊ฐ ํ ์๋ฒ์ง ๋
ธ๋ (p[p[z]]) ์ ์ค๋ฅธ์ชฝ ์์์ผ๋
โพ case 2-1 : z๊ฐ p[z]์ ์ผ์ชฝ ์์
- p[z]๋ฅผ ์ค์ฌ์ผ๋ก ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ์ํค๊ณ , ์ฌ์ ํ ๋ ๋ ๋ธ๋ํธ๋ฆฌ ํน์ฑ์ ์๋ฐํ๋ฏ๋ก case 2-2๋ฅผ ์ํํ๋ค.
โพ case 2-2 : z๊ฐ p[z]์ ์ค๋ฅธ์ชฝ ์์
- p[p[z]]๋ฅผ ์ค์ฌ์ผ๋ก ์ผ์ชฝ ํ์ ์ํค๊ณ , p[z]์ p[p[z]]์ ์์์ ๋ฐ๊พผ๋ค.
(๋ถ๋ชจ๋
ธ๋๋ ๋ธ๋์ผ๋ก, ํ ์๋ฒ์ง ๋
ธ๋๋ ๋ ๋๋ก)
z๋ฅผ ํ ์๋ฒ์ง ๋
ธ๋ ( p[p[z]] )๋ก ๋ฐ๊ฟ์ฃผ๊ณ ํ ์๋ฒ์ง์ ๋ถ๋ชจ๊ฐ Red๊ฐ ์๋๋๊น์ง ์์ case๋ฅผ ๋ฐ๋ณตํด์ค๋ค.
BST์ ํน์ฑ์ ์ ์งํ๋ฉด์ ์ญ์ ํ ํ, ์ญ์ ํ ๋
ธ๋์ ์์๋
ธ๋ ๊ฐ์์ ๋ฐ๋ผ rotation ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๋ค.
๋ํ, ์ง์์ง ๋
ธ๋์ ์๊น์ด Black์ด๋ผ๋ฉด, Black-Height๊ฐ 1๊ฐ์ํ ๊ฒฝ๋ก์ black node๊ฐ 1๊ฐ ์ถ๊ฐ๋๋๋ก rotaionํ๋ค.
NULL node(leaf node) ์ญ์ black ์ด๋ค.
๐ด case default : ์ญ์ ํ ๋
ธ๋๋ฅผ z๋ผ ํ ๋, z๊ฐ RED๋ผ๋ฉด ๊ทธ๋ฅ ์ญ์ ํ๊ณ , (z์ ์์์ด ๋๊ฐ์ธ ๊ฒฝ์ฐ๋ ์ค๋ฅธ์ชฝ ์์์ ๊ฐ์ฅ ์์ key์ key๊ฐ์ ๊ตํ ํ z->right์ minimum ๋
ธ๋๋ฅผ ์ญ์ ํ๊ฒ ๋๋ฏ๋ก ์ด ๋
ธ๋์ ์์ด RED๋ผ๋ฉด)
BLACK์ด๋ผ๋ฉด, black-height๊ฐ ์๋ง๊ฒ ๋๋ฏ๋ก fix up์ ์ํํ๋ค. (์ด๋, double-black๊ฐ๋
์ด ๋ฑ์ฅํ๋ค.)
์ญ์ ๋ ์ฝ์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ญ์ ํ ๋
ธ๋ z๋์ ์์นํ ๋
ธ๋ x๊ฐ p[x]์ ์ผ์ชฝ ์์์ธ์ง ์ค๋ฅธ์ชฝ ์์์ธ์ง์ ๋ํด ๋์นญํ๋ค.
์ญ์ ํ ๋
ธ๋ z๋์ ์๋ก ์์นํ ๋
ธ๋๋ฅผ x, ๊ทธ ํ์ ๋
ธ๋๋ฅผ s๋ผ๊ณ ํ ๋,
๐ด case 1 : s๊ฐ RED์ธ ๊ฒฝ์ฐ
์ด๋๋ s์ ์์๋ค์ leafNode ์ผ ์ ์๋ค.(์กฐ๊ฑด 5 ์๋ฐ) => ํ๊ฐ๋ผ๋ leafnode์ผ ์ black-heigh๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ๋ฌด์กฐ๊ฑด ๋๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๐ธ x๊ฐ ๋ถ๋ชจ๋
ธ๋ p[x]์ ์ผ์ชฝ ์์์ผ๋
- s๋ฅผ BLACK์ผ๋ก p[x]๋ฅผ RED๋ก ๋ฐ๊ฟ์ค๋ค.
- p[x]๋ฅผ left-Rotate ์์ผ์ค๋ค.
- x์ ์๋ก์ด ํ์ ๋
ธ๋๋ฅผ ๋ฌ์์ค๋ค. (s = p[x]->right) ==> x์ ์๋ก์ด ํ์ ๋
ธ๋๋ ์๋ s์ ์ผ์ชฝ ์์๋
ธ๋ (left-Rotate์์ผ์ฃผ์๊ธฐ ๋๋ฌธ)
๐ธ x๊ฐ ๋ถ๋ชจ๋
ธ๋ p[x]์ ์ค๋ฅธ์ชฝ ์์์ผ๋
- s๋ฅผ BLACK์ผ๋ก p[x]๋ฅผ RED๋ก ๋ฐ๊ฟ์ค๋ค.
- p[x]๋ฅผ right-Rotate ์์ผ์ค๋ค.
- x์ ์๋ก์ด ํ์ ๋
ธ๋๋ฅผ ๋ฌ์์ค๋ค. (s = p[x]->left) ==> x์ ์๋ก์ด ํ์ ๋
ธ๋๋ ์๋ s์ ์ผ์ชฝ ์์๋
ธ๋ (left-Rotate์์ผ์ฃผ์๊ธฐ ๋๋ฌธ)
์์ง double-black์ด ๋จ์๊ธฐ ๋๋ฌธ์ case 2/3/4๋ฅผ ์งํํ๋ค.
๐ด case 2 :s๊ฐ BLACK, s์ ์์๋ค๋ BLACK์ผ๋
- x์ double-blackd์ ์ง์ฐ๊ณ s๋ฅผ RED๋ก ๋ฐ๊พผ๋ค.
- p[x]๋ฅผ x๋ก ํด์ ๊ณ์ ํ๋ค.
- ๋ง์ฝ, case 1์ ๊ฑฐ์น๊ณ case 2๋ก ์๋ค๋ฉด, p[x]๋ red์๊ธฐ๋๋ฌธ์ ์ข
๋ฃ๋๋ค. ( => s์ ์์๋ค์ด ๋ชจ๋ black์ธ ์ฑ๋ก ์๊ธฐ ๋๋ฌธ์ black-height๋ ์ ์ง)
๐ด case 3 : s๋ BLACK, s์ ์ผ์ชฝ ์์์ด RED, ์ค๋ฅธ์ชฝ ์์์ด BLACK ์ธ ๊ฒฝ์ฐ
๐ธ x๊ฐ ๋ถ๋ชจ๋
ธ๋ p[x]์ ์ผ์ชฝ ์์์ผ๋
- s๋ฅผ RED, s์ ์ผ์ชฝ ์์์ BLACK์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
- s๋ฅผ ์ค์ฌ์ผ๋ก right-Rotate ์์ผ์ค๋ค.
- x์ ์๋ก์ด ํ์ ๋
ธ๋๋ฅผ ๋ฌ์์ค๋ค. ( s = p[x]->right)
๐ธ x๊ฐ ๋ถ๋ชจ๋
ธ๋ p[x]์ ์ค๋ฅธ์ชฝ ์์์ผ๋
- s๋ฅผ RED, s์ ์ผ์ชฝ ์์์ BLACK์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
- s๋ฅผ ์ค์ฌ์ผ๋ก left-Rotate ์์ผ์ค๋ค.
- x์ ์๋ก์ด ํ์ ๋
ธ๋๋ฅผ ๋ฌ์์ค๋ค. ( s = p[x]->left)
case 3์ ๊ฒฝ์ฐ๋ ์์ ๊ณผ์ ์ ๋๋ด๊ณ case 4๋ฅผ ์ด์ด์ ์ํํ๋ค.
๐ด case 4 : s๋ BLACK, s์ ์ค๋ฅธ์ชฝ ์์์ด RED์ธ ๊ฒฝ์ฐ
๐ธ x๊ฐ ๋ถ๋ชจ๋
ธ๋ p[x]์ ์ผ์ชฝ ์์์ผ๋
- s์ ์์ p[x]์ ์์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
- p[x]์ ์์ BLACK, s์ ์ค๋ฅธ์ชฝ ์์์ BLACK์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
- p[x]์ ๋ํด์ left-rotate๋ฅผ ์์ผ์ค๋ค.
- x์ double-black์ ์ ๊ฑฐํ๊ณ ์ข
๋ฃํ๋ค.
๐ธ x๊ฐ ๋ถ๋ชจ๋
ธ๋ p[x]์ ์ค๋ฅธ์ชฝ ์์์ผ๋
- s์ ์์ p[x]์ ์์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
- p[x]์ ์์ BLACK, s์ ์ผ์ชฝ ์์์ BLACK์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
- p[x]์ ๋ํด์ right-rotate๋ฅผ ์์ผ์ค๋ค.
- x์ double-black์ ์ ๊ฑฐํ๊ณ ์ข
๋ฃํ๋ค.
x๊ฐ root์ด๊ฑฐ๋ double black์ด ๊นจ์ง๋๊น์ง ๋ฐ๋ณตํด์ค ํ, x๋ฅผ black์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
Red Black Tree๋ BST์ ์ผ์ข
์ด๊ธฐ ๋๋ฌธ์ ํ์์ ๋ฐฅ๋ฒ์ ์ผ๋ฐ์ ์ธ Bianry Tree์ ํ์ ๋ฐฉ๋ฒ๊ณผ ๋ค๋ฅด์ง ์๋ค.
์ผ๋ฐ BST์ skewdํ ๊ฒฝ์ฐ๋ฅผ balancing๊ธฐ๋ฒ์ ํตํด balancedํ tree๋ฅผ ๋ง๋ค์์ผ๋ฏ๋ก ํ์๊ณผ์ ์ ์ํ๋ ๋๋ก O(lgn)์ด ๋์จ๋ค. ์ฝ์
์ ์ผ๋ฐ BST์์ ์ต๋ 2๋ฒ์ rotate๊ณผ์ ๊ณผ ์ ๋ณํ์ด ์ถ๊ฐ ๋์๋ ๋ฐ, rotate๊ณผ์ ์ ํฌ์ธํฐ๋ณ์๋ฅผ ๊ตํํด์ฃผ๋ ๊ฒ์ด๋ฏ๋ก O(1)์ ์๊ฐ ๋ณต์ก๋์ ์๋ณํ๋ ๋จ์ํ ๋ณ์๊ฐ ๋ณ๊ฒฝ์ด๋ฏ๋ก O(1)์ ์ ๋ณํ์ด O(lgn)๋ฒ ์ผ์ด๋๊ธฐ ๋๋ฌธ์, O(lgn)์ ๊ฐ๋๋ค. ์ญ์ ๋ ์ฝ์
๊ณผ ๋์ผํ ์ด์ ์ด๋ฉฐ, rotate๊ณผ์ ์ ์ต๋ 3๋ฒ์ด O(lgn)๋ฒ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ O(lgn)์ด ๋์จ๋ค.