Skip to content

Commit

Permalink
πŸŽ„Red Black Tree πŸŽ„ (#5)
Browse files Browse the repository at this point in the history
* Step 1: BST Insert, Search κ΅¬ν˜„

* docs: RedBlackTree κ°œλ… 정리(μ‚½μž…κΉŒμ§€)

* feat: RedBlackTree balanced μ‚½μž… κ΅¬ν˜„

- printTree : 트리 ꡬ쑰 확인
- isBalanced : L,R μ„œλΈŒ 트리의 높이 μ°¨κ°€ 1보닀 크지 μ•Šλ„λ‘
- rotateLeft, rotateRight : pivotκΈ°μ€€μœΌλ‘œ 트리 νšŒμ „
- fixInsertion: μ‚½μž… 이상에 λŒ€ν•˜μ—¬ 트리 μž¬κ΅¬μ„±

* feat: balance 체크 ν•¨μˆ˜ μˆ˜μ •

- prev 버전은 AVL 트리의 높이 μ²΄ν¬ν•˜λŠ” κ²ƒμ΄μ˜€μŒ
- redBlack 쑰건 λ§Œμ‘±ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” ν•¨μˆ˜ μΆ”κ°€

* refactor: Node μ—μ„œ RBTreeNode둜 넀이밍 λ³€κ²½

* docs: Red-Black Tree Height μ΅œλŒ€ 높이 증λͺ…

* docs: RedBlack Tree μ‚½μž… 이상 case μˆ˜μ •

- case 4 -> case 2
- case 2 -> case 1

* docs: RedBlack Tree μ„€λͺ… 파일 뢄리 및 λ¦¬λ“œλ―Έ μž‘μ„±

- Tree νšŒμ „
- RB Tree insert 정리

* docs: BST Delete μ—°μ‚°

* refactor: nodeRotate, search root μ½”λ“œ Tree -> Node둜 이동

* docs: Red-Black Tree Delete μ‘°μ •

* docs: RedBlackTree 색 λ°˜μ „ μ„€λͺ…

* refactor: search ν•¨μˆ˜ λ°˜ν™˜κ°’ Node둜 λ³€κ²½

* feat: Red-Black Tree μ‚­μ œ + μ‚­μ œ 이상 κ΅¬ν˜„

* feat: successor κ°€  successor parent 의 였λ₯Έμͺ½, μ™Όμͺ½ μžμ‹μΈμ§€ λΆ„κΈ°μ²˜λ¦¬

successor 의 λΆ€λͺ¨κ°€ root일 경우 succesor λŠ” λΆ€λͺ¨μ˜  였λ₯Έμͺ½ μžμ‹μ΄λ‹€

* test: RedBlackTree λͺ¨λ“  μ‚­μ œ case Test

* docs: red black tree 잘λͺ»λœ μ„€λͺ… μˆ˜μ •

* docs: RedBlackTree vs AVL Tree
  • Loading branch information
murjune authored Dec 25, 2024
1 parent 6f3bcf9 commit 3650856
Show file tree
Hide file tree
Showing 46 changed files with 1,743 additions and 1 deletion.
12 changes: 11 additions & 1 deletion algorithm-practice/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,14 @@
### μ΅œλ‹¨ 경둜

- [λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜](./src/main/java/com/murjune/practice/algorithm/dijkstra)
- [ν”Œλ‘œμ΄λ“œ-와샬 μ•Œκ³ λ¦¬μ¦˜](./src/main/java/com/murjune/practice/algorithm/floyd)
- [ν”Œλ‘œμ΄λ“œ-와샬 μ•Œκ³ λ¦¬μ¦˜](./src/main/java/com/murjune/practice/algorithm/floyd)

## 자료ꡬ쑰

### BST (Binary Search Tree)
- [Red-Black Tree μ½”λ“œ κ΅¬ν˜„](./src/main/java/com/murjune/practice/algorithm/datastructure/bst/RedBlackTree.kt) | [Test μ½”λ“œ](./src/test/kotlin/com/murjune/practice/algorithm/datastructure/bst/RedBlackTreeTest.kt)
- [BST μ‚­μ œ](./src/main/java/com/murjune/practice/algorithm/datastructure/bst/BST_Delete.md)
- [Red-Black Tree](./src/main/java/com/murjune/practice/algorithm/datastructure/bst/RedBlackTree.md)
- [Red-Black Tree μ‚½μž…](./src/main/java/com/murjune/practice/algorithm/datastructure/bst/RedBlackTree_Insert.md)
- [Red-Black Tree 제거](./src/main/java/com/murjune/practice/algorithm/datastructure/bst/RedBlackTree_Delete.md)
- [트리의 νšŒμ „](./src/main/java/com/murjune/practice/algorithm/datastructure/bst/TreeRotate.md)
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
BST 의 μ—°μ‚° 쀑 μ‚­μ œ 연산이 κ°€μž₯ κΉŒλ‹€λ‘­λ‹€.
그리고, BST 의 μ‚­μ œ 연산을 기반으둜 Red-Black Tree 와 AVL Tree 의 μ‚­μ œ 연산이 μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ— BST 의 μ‚­μ œ 연산을 λ°˜λ“œμ‹œ 잘 μ•Œκ³  μžˆμ–΄μ•Ό ν•œλ‹€.

## BST μ‚­μ œ

BST 의 μ‚­μ œλŠ” λ‹€μŒκ³Ό 같은 3가지 case 둜 λ‚˜λˆŒ 수 μžˆλ‹€.

1) μ‚­μ œν•  λ…Έλ“œκ°€ leaf λ…Έλ“œμΈ 경우 (μžμ‹ 0개)
2) μ‚­μ œν•  λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œλ₯Ό ν•œ 개 가지고 μžˆλŠ” 경우 (μžμ‹ 1개)
3) μ‚­μ œν•  λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œλ₯Ό 두 개 가지고 μžˆλŠ” 경우 (μžμ‹ 2개)

이 쀑 3번째 case κ°€ κ°€μž₯ λ³΅μž‘ν•˜λ‹€.


## Case 1) μ‚­μ œν•  λ…Έλ“œκ°€ leaf λ…Έλ“œμΈ 경우

μ‚­μ œν•  λ…Έλ“œκ°€ leaf λ…Έλ“œμΈ 경우, μ‚­μ œν•  λ…Έλ“œμ˜ λΆ€λͺ¨ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ₯Ό μ—†μ•  μ£Όλ©΄ 끝이닀.

```
10
/ \
5 20
/ \
15 30
```

리프 λ…Έλ“œμΈ 15λ₯Ό μ‚­μ œ ν•˜λ©΄ 끝이닀.

```
10
/ \
5 20
/ \
null 30
```

## Case 2) μ‚­μ œν•  λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œλ₯Ό ν•œ 개 가지고 μžˆλŠ” 경우

μžμ‹μ΄ 1개인 λ…Έλ“œλ₯Ό μ‚­μ œν•  경우, μ‚­μ œν•  λ…Έλ“œλ₯Ό μžμ‹μ΄ λŒ€μ²΄ν•˜λ©΄ λœλ‹€.

```
10
/ \
5* 20
/ \
15 30
```

10을 μ‚­μ œν•  경우, 10의 μžμ‹μΈ 5κ°€ 10의 자리λ₯Ό λŒ€μ²΄ν•œλ‹€.

```
5
/ \
null 20
/ \
15 30
```

Case 1 κ³Ό Case 2 λŠ” κ°„λ‹¨ν•˜λ‹€.
이제 Case 3 λ₯Ό μ‚΄νŽ΄λ³΄κΈ° μ•žμ„œ successor 와 predecessor 에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

## Successor 와 Predecessor

BST μ—μ„œ Successor 와 Predecessor λŠ” λ‹€μŒκ³Ό 같이 μ •μ˜ν•œλ‹€.

- Successor: μ‚­μ œν•  λ…Έλ“œμ˜ 였λ₯Έμͺ½ μ„œλΈŒ νŠΈλ¦¬μ—μ„œ κ°€μž₯ μž‘μ€ λ…Έλ“œ
- Predecessor: μ‚­μ œν•  λ…Έλ“œμ˜ μ™Όμͺ½ μ„œλΈŒ νŠΈλ¦¬μ—μ„œ κ°€μž₯ 큰 λ…Έλ“œ

```
10
/ \
5 20
/ \ / \
3 15 18 30
```

λ…Έλ“œ 10의 `Successor` λŠ” λ…Έλ“œ 15 이닀.
λ…Έλ“œ 10의 `Predecessor` λŠ” λ…Έλ“œ 5 이닀.

이제 Case 3 을 μ‚΄νŽ΄λ³΄μž.

## Case 3) μ‚­μ œν•  λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œλ₯Ό 두 개 가지고 μžˆλŠ” 경우

- μ‚­μ œν•  λ…Έλ“œμ˜ μžμ‹μ΄ 2개인 경우, μ‚­μ œν•  λ…Έλ“œλ₯Ό Successor λ˜λŠ” Predecessor 둜 λŒ€μ²΄ν•œλ‹€.

Successor 둜 μ„€λͺ…ν•˜κ² λ‹€.

```
10
/ \
5 20
/ \ / \
3 15 18* 30
```

μœ„ νŠΈλ¦¬μ—μ„œ 10을 μ‚­μ œν•  경우, Successor λ…Έλ“œμΈ 18둜 λŒ€μ²΄ν•œλ‹€.

```
18
/ \
5 20
/ \ \
3 15 30
```

μ–Έλ“― 보기에 별거 μ—†μ–΄ 보일 수 μžˆμ§€λ§Œ, μ„ μž„μžκ°€ μžμ‹μ„ 가지고 μžˆλŠ” κ²½μš°λ„ κ³ λ €ν•΄μ€˜μ•Όν•œλ‹€.
λ‹€μŒ μ˜ˆμ‹œλ₯Ό 보자

```
10
/ \
5 20
/ \ / \
3 8 13* 30
\
15
/ \
14 16
```

μœ„μ™€ λ™μΌν•˜κ²Œ 10을 μ‚­μ œν•˜κ³ , 13을 Successor 둜 λŒ€μ²΄ν•œλ‹€.

```
13*
/ \
5 20
/ \ / \
3 8 null 30
\
15
/ \
14* 16
```

13의 μžλ¦¬κ°€ λΉ„μ—ˆμœΌλ―€λ‘œ, 13의 자리λ₯Ό 15둜 λŒ€μ²΄ν•œλ‹€.

```
13
/ \
5 20
/ \ / \
3 8 15 30
/ \
14 16
```
Loading

0 comments on commit 3650856

Please sign in to comment.