BST (Binary_Search_Tree) - sihyun10/data_structures_docker GitHub Wiki
BST๋? (Binary Search Tree)
๋ชจ๋ ์์๋ ์ ์ผํ key ๊ฐ์ ๊ฐ๋๋ค (์ค๋ณต ์์)
์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์ ๋ชจ๋ ์์๋ค์ ๋ฃจํธ(root)์ ํค๋ณด๋ค ์์ ๊ฐ์ ๊ฐ๋๋ค
์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ์ ๋ชจ๋ ์์๋ค์ ๋ฃจํธ(root)์ ํค๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ๋๋ค
์ฆ ์ผ์ชฝ ์๋ธํธ๋ฆฌ < ๋ฃจํธ < ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ์์์ด๋ค.
์ผ์ชฝ ์๋ธํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๋ ๋ค ์ด์ง ํ์ํธ๋ฆฌ์ด๋ค
8
/ \
3 10
/ \ \
1 6 14
/ \ /
4 7 13
BST์ ํน์ง
- ์ค์ ์ํ(
Inorder Traversal
)๋ฅผ ์ํํ๋ฉด ์ ๋ ฌ(์ค๋ฆ์ฐจ์)๋ ๊ฐ์ด ๋์จ๋ค - [์๊ฐ๋ณต์ก๋] ๊ท ํ ์ํ :
O(logN)
, ๋ถ๊ท ํ ์ํ : ์ต๋O(N)
BST ๊ตฌ์กฐ์ฒด
// ์ด์ง ํ์ ํธ๋ฆฌ ๋
ธ๋ 1๊ฐ๋ฅผ ๋ํ๋ด๋ ๊ตฌ์กฐ
typedef struct _bstnode {
int item;
struct _bstnode *left;
struct _bstnode *right;
} BSTNode;
- item : ์ด ๋ ธ๋๊ฐ ๊ฐ์ง๋ ์ ์ ๋ฐ์ดํฐ
- left : ์ผ์ชฝ ์์ ๋ ธ๋์ ์ฃผ์
- right : ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ์ฃผ์
Q. ์ left, right๋ ์๊ธฐ์ฐธ์กฐ(self-reference) ๊ตฌ์กฐ์ฒด์ผ๊น?
์ด์งํธ๋ฆฌ์์ ๋ ธ๋๊ฐ ๋ค๋ฅธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํ๋๋ฐ, ์ ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์จ์ผํ๋์ง ๊ถ๊ธํ๋ค.
ํธ๋ฆฌ๋ ๋ ธ๋๋ค๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ผํ๋ค.
// 10์ ๋ฃจํธ(root) ๋
ธ๋
// 10์ ์ผ์ชฝ ์์ : 5 (root->left = ์ฃผ์_5)
// 10์ ์ค๋ฅธ์ชฝ ์์ : 15 (root->right = ์ฃผ์_15)
10
/ \
5 15
๋ ธ๋๋ผ๋ฆฌ ์๋ก ์ฃผ์๋ก ์ฐ๊ฒฐ๋์ด์ผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ์ฑํ ์ ์๋ค.
ํธ๋ฆฌ ๊ตฌ์กฐ๋ ์ฌ๊ท์ ์ธ ๊ตฌ์กฐ์ด๋ค.
10
/
5
5๋ฅผ ํผ์ ๋ณด๋ฉด "๋ฃจํธ ๋ ธ๋"๊ฐ ๋ ์ ์๋ค
ํธ๋ฆฌ๋ ์ด๋ ๊ฒ ์์ ํธ๋ฆฌ๋ค์ด ๊ณ์ ์ฐ๊ฒฐ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์, ์์๋ค๋ ๋๊ฐ์ด BST Node๋๊น "๊ฐ ๋
ธ๋๊ฐ ์์ ์ ์์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌ์ผ์ผํ๋ค"
๊ทธ๋์ ์๊ธฐ ์์ ์ ์ฐธ์กฐํ๋ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด ์์ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ค
์ฆ ์ ๋ฆฌํ์๋ฉด
left, right๋ ์์ ๋
ธ๋์ ์ฐ๊ฒฐํ๋ ํต๋ก์ด๋ฉฐ,
๊ทธ๊ฑธ ํตํด ๋
ธ๋๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋ง๋ค์ด์ง๋ ๊ฒ์ด๋ค.