Binary Search Tree๋?
Binary(์ด์ง) Search(ํ์) Tree(ํธ๋ฆฌ)๊ฐ ํฉ์ณ์ง ๊ฒ์ผ๋ก,
์ฆ, ์ด๋ถํ๋ ํ์์ ์ํ(ํน์ ํนํ๋) ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ๋ผ๋ ๋ป์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ํธ๋ฆฌ๊ฐ ๋ฌด์์ผ๊น?
์์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ Tree ๊ตฌ์กฐ๋ผ๊ณ ํ๋๋ฐ, ๊ฑฐ๊พธ๋ก ๋ณด๋ฉด ๋๋ฌด๊ฐ์ด ์๊ฒจ์ ๊ทธ๋ ๊ฒ ๋ถ๋ฅธ๋ค๊ณ ํ๋ค.
์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์์์ผ ํ ๊ฒ์ด ์๋๋ฐ, ๊ทธ ๋ถ๋ถ์ ์๋์ ๊ฐ๋ค.
๋ถ๋ชจ ๋ ธ๋(parent node) : ์๊ธฐ ์์ (๋ ธ๋)๊ณผ ์ฐ๊ฒฐ ๋ ๋ ธ๋ ์ค ์์ ๋ณด๋ค ๋์ ๋ ธ๋๋ฅผ ์๋ฏธ (ex. F์ ๋ถ๋ชจ๋ ธ๋ : B)
์์ ๋ ธ๋(child node) : ์๊ธฐ ์์ (๋ ธ๋)๊ณผ ์ฐ๊ฒฐ ๋ ๋ ธ๋ ์ค ์์ ๋ณด๋ค ๋ฎ์ ๋ ธ๋๋ฅผ ์๋ฏธ (ex. C์ ์์๋ ธ๋ : G, H)
๋ฃจํธ ๋ ธ๋ (root node) : ์ผ๋ช ๋ฟ๋ฆฌ ๋ ธ๋๋ผ๊ณ ํ๋ฉฐ ๋ฃจํธ ๋ ธ๋๋ ํ๋์ ํธ๋ฆฌ์์ ํ๋๋ฐ์ ์กด์ฌํ์ง ์๊ณ , ๋ถ๋ชจ๋ ธ๋๊ฐ ์๋ค. ์ ์ด๋ฏธ์ง์์ ๋ น์์ด ๋ฟ๋ฆฌ๋ ธ๋๋ค.
๋จ๋ง ๋ ธ๋(leaf node) : ๋ฆฌํ ๋ ธ๋๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ ์์ ๋ ธ๋๊ฐ ์๋ ๋ ธ๋๋ฅผ ์๋ฏธํ๋ค. ์ ์ด๋ฏธ์ง์์ ์ฃผํฉ์ ๋ ธ๋๊ฐ ๋จ๋ง๋ ธ๋๋ค.
๋ด๋ถ ๋ ธ๋(internal node) : ๋จ๋ง ๋ ธ๋๊ฐ ์๋ ๋ ธ๋
ํ์ ๋ ธ๋(sibling node) : ๋ถ๋ชจ๊ฐ ๊ฐ์ ๋ ธ๋๋ฅผ ๋งํ๋ค. (ex. D, E, F๋ ๋ชจ๋ ๋ถ๋ชจ๋ ธ๋๊ฐ B์ด๋ฏ๋ก D, E, F๋ ํ์ ๋ ธ๋๋ค.)
๊น์ด(depth) : ํน์ ๋ ธ๋์ ๋๋ฌํ๊ธฐ ์ํด ๊ฑฐ์ณ๊ฐ์ผ ํ๋ '๊ฐ์ ์ ๊ฐ์'๋ฅผ ์๋ฏธ (ex. F์ ๊น์ด : A→B→F ์ด๋ฏ๋ก ๊น์ด๋ 2๊ฐ ๋จ)
๋ ๋ฒจ(level) : ํน์ ๊น์ด์ ์๋ ๋ ธ๋๋ค์ ์งํฉ์ ๋งํ๋ฉฐ, ๊ตฌํํ๋ ์ฌ๋์ ๋ฐ๋ผ 0 ๋๋ 1๋ถํฐ ์์ํ๋ค. (ex. D, E, F, G, H)
์ฐจ์(degree) : ํน์ ๋ ธ๋๊ฐ ํ์(์์) ๋ ธ๋์ ์ฐ๊ฒฐ ๋ ๊ฐ์ (ex. B์ ์ฐจ์ = 3 {D, E, F} )
๊ทธ๋ฌ๋ฉด Binary(์ด์ง)์ ๋ฌด์จ ๋ป์ผ๊น? ์ฝ๊ฒ ๋งํด ์ด๋ถํ ๋๋ค๋ ๊ฒ์ด๋ค.
์์ ๋ณธ ํธ๋ฆฌ ๊ตฌ์กฐ์์ ํน์ ํ ํํ๋ก ์ ํ์ ํ๊ฒ ๋๋๋ฐ, ๋ชจ๋ ๋ ธ๋์ ์ต๋ ์ฐจ์๋ฅผ 2๋ก ์ ํํ ๊ฒ์ด๋ค. ์กฐ๊ธ ์ฝ๊ฒ ๋งํ์๋ฉด ๊ฐ ๋ ธ๋๋ ์์๋ ธ๋๋ฅผ ์ต๋ 2๊ฐ๊น์ง๋ฐ์ ๋ชป๊ฐ๋๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฅผ '์ด์ง ํธ๋ฆฌ(Binary Tree)'๋ผ๊ณ ํ๋ค.
์์ ์ด๋ฏธ์ง์์๋ B๋ ธ๋๊ฐ ์ฐจ์๊ฐ 3์ด๋ฏ๋ก ์ด์งํธ๋ฆฌ๊ฐ ์๋๋ค. ์ฆ, ์ด์งํธ๋ฆฌ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๋๋ค.
๊ทธ๋ผ ์ด์ ๋ง์ง๋ง์ผ๋ก ํ์์ ํนํ ๋ ํธ๋ฆฌ๋ ๋ฌด์์ ์๋ฏธํ ๊น?
์ผ๋จ, ํ ๋ฒ ๊ณ ๋ฏผ์ ํด๋ณด์. ๋ง์ฝ ์ ์ด์งํธ๋ฆฌ์ ๊ฐ ๋ ธ๋๊ฐ ๊ฐ๊ณ ์๋ ๊ฐ์ด ๊ท์น ์์ด ์ค๊ตฌ๋๋ฐฉ์ด๋ฉด ํน์ ๊ฐ์ ์ฐพ๊ธฐ ์ํด์๋ ์ต์ ์ ๊ฒฝ์ฐ ์ ๊ฐ๊ฐ์ ๋ ธ๋๋ฅผ ๋ชจ๋ ์ํ(ํ์)ํด์ผ ํ๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ ์ ์ด์งํธ๋ฆฌ์์ ์ฐ๋ฆฌ๋ ์กฐ๊ฑด์ ํ๋ ๋ ๋ถ์ด๊ฒ ๋๋ค.
"๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ์์ ๋ ธ๋๋ค์ ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ์์ผ๋ฉฐ, ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ค์ ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ํฌ๋ค"
์กฐ๊ธ ๋ ์ค์ฌ ๋งํ์๋ฉด ๋๋ฅผ ๋ถ๋ชจ ๋ ธ๋๋ผ๊ณ ํ ๋ ์์ ๋ณด๋ค ์์ ๊ฐ์ ์ผ์ชฝ ์์๋ ธ๋, ์์ ๋ณด๋ค ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ ๋ ธ๋์ ๋ฐฐ์ ํ๋ค๋ ๊ฒ์ด๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด ์ด๋ฏธ์ง๋ก ๋ณด์๋ฉด ์๋์ ๊ฐ๋ค.
์์ ๊ฐ์ด ๋ถ๋ชจ ๋ ธ๋ ๊ธฐ์ค์ผ๋ก ๋์ ๊ด๊ณ์ ๋ฐ๋ผ ์ผ์ชฝ์ ์์ ๊ฐ์ด, ์ค๋ฅธ์ชฝ์ ํฐ ๊ฐ์ด ๋ค์ด๊ฐ๋๋ก ๊ตฌ์ฑํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๊ตฌ์ฑ์ฌ๋ฉด ์ฐ๋ฆฌ๊ฐ ํน์ ๊ฐ์ ํ์ํ๋ ค ํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์๋ค.
ํ์ฌ ํ์ ๋ ธ๋์ ์ฐพ์ผ๋ ค๋ ๊ฐ์ ๋์ ๊ด๊ณ๋ฅผ ๋น๊ตํด์ ์๋ค๋ฉด ์ผ์ชฝ ๋ ธ๋๋ก ํ์ํ๋ฌ ๊ฐ๋ฉด ๋๊ณ , ๋ฐ๋๋ก ํฌ๋ฉด ์ค๋ฅธ์ชฝ ๋ ธ๋๋ก, ๊ฐ๋ค๋ฉด ๊ทธ ๊ฐ์ ์ฐพ๊ฒ ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๊ตฌ์ฑํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ด์ง ํ์ ํธ๋ฆฌ๊ฐ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ๋ ์ ๋์ถฉ ์๊ฒ๋์์ผ๋, ๊ตฌํ์ผ๋ก ๋์ด๊ฐ๋ณด๋๋ก ํ๊ฒ ๋ค.
์ด์งํ์ํธ๋ฆฌ ๊ตฌํ
Node ๊ตฌํ
๊ธฐ๋ณธ์ ์ผ๋ก Tree๋ Node๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ๋ฌผ๋ก ๋ฐฐ์ด๋ก๋ ๊ตฌํ์ ๊ฐ๋ฅํ์ง๋ง, ์ดํ ์์ Tree ์๋ฃ๊ตฌ์กฐ๋ค์์ 'ํ์ '์ด๋ผ๋ ๊ฐ๋ ์ด ๋ฑ์ฅํ๊ธฐ ๋๋ฌธ์ ์คํ๋ ค ๋ ธ๋๋ก ๊ตฌํํ๋๊ฒ ์ข ๋ ์ฉ์ดํ๋ค.
์์ ์ค๋ช ์์๋ ๋ณด์ จ๋ฏ ์ผ๋จ Tree์ ํ์ํ ๋ ธ๋(Node)๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋๋ค.
static class Node {
int data;
Node left;
Node right;
Node(int data) {
this.data = data;
}
}
public Node root;
์ํ์ ์ธ ํ์ ์ฐ์ฐ(์ฌ๊ท์ ์ธ ๋ฐฉ๋ฒ) ๊ตฌํ
์ด์ง ํ์ ํธ๋ฆฌ์์ ํน์ ํ ํค๊ฐ์ ๊ฐ์ง ๋ ธ๋๋ฅผ ์ฐพ๊ธฐ ์ํด์๋ ๋จผ์ ์ฃผ์ด์ง ํ์ํค ๊ฐ๊ณผ ๋ฃจํธ ๋ ธ๋์ ํค๊ฐ์ ๋น๊ตํ๋ค.
๋น๊ตํ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ 3๊ฐ์ง๋ก ๋๋์ด์ง๋ค.
- ๋น๊ตํ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ผ๋ฉด ํ์์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋๋ค.
- ๋น๊ตํ ๊ฒฐ๊ณผ๊ฐ, ์ฃผ์ด์ง ํค ๊ฐ์ด ๋ฃจํธ ๋ ธ๋์ ํค๊ฐ๋ณด๋ค ์์ผ๋ฉด, ํ์์ ์ด ๋ฃจํธ ๋ ธ๋์ ์ผ์ชฝ ์์์ ๊ธฐ์ค์ผ๋ก ๋ค์ ์์ํ๋ค.
- ๋น๊ตํ ๊ฒฐ๊ณผ๊ฐ, ์ฃผ์ด์ง ํค ๊ฐ์ด ๋ฃจํธ ๋ ธ๋์ ํค๊ฐ๋ณด๋ค ํฌ๋ฉด, ํ์์ ์ด ๋ฃจํธ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์์ ๊ธฐ์ค์ผ๋ก ๋ค์ ์์ํ๋ค.
- ํ์ํค ๊ฐ == ๋ฃจํธ ๋ ธ๋์ ํค ๊ฐ : ํ์ ์๋ฃ
- ํ์ํค ๊ฐ < ๋ฃจํธ ๋ ธ๋์ ํค ๊ฐ : ๋ฃจํธ ๋ ธ๋์ ์ผ์ชฝ ์์ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌํ์
- ํ์ํค ๊ฐ > ๋ฃจํธ ๋ ธ๋์ ํค ๊ฐ : ๋ฃจํธ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌํ์
์ฝ๋๊ตฌํ
// ์ํ์ ์ธ ํ์
public static Node circularSearch(Node node, int key) {
if(node == null) {
return null;
}
if(key == node.data) {
return node;
} else if(key < node.data) {
return circularSearch(node.left, key);
} else {
return circularSearch(node.right, key);
}
}
๋ฐ๋ณต์ ์ธ ํ์ ์ฐ์ฐ(while์ ์ฌ์ฉํ ๋ฐ๋ณต๋ฌธ) ๊ตฌํ
while๋ฌธ์ ์ด์ฉํด ๋ฐ๋ณต์ ์ธ ๊ธฐ๋ฒ์ผ๋ก ํ์ ์ฐ์ฐ์ ๊ตฌํํ ๊ฒ์ด๋ค.
๋งค๊ฐ๋ณ์ node๊ฐ null์ด ์๋๋ฉด ๋ฐ๋ณต์ ๊ณ์ํ๋ค.
๋ฐ๋ณต ๋ฃจํ ์์์๋ ํ์ฌ node์ data๊ฐ์ด key๊ฐ๊ณผ ๊ฐ์์ง ๊ฒ์ฌํ๋ค.
- ๊ฐ์ผ๋ฉด ํ์ ์ฑ๊ณต์ผ๋ก ํ์ฌ ๋ ธ๋๋ฅผ ๋ฐํํ๊ณ ๋
- key๊ฐ ํ์ฌ ๋ ธ๋๊ฐ๋ณด๋ค ์์ผ๋ฉด node ๋ณ์๋ฅผ node์ ์ผ์ชฝ ์์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝ
- key๊ฐ์ด ํ์ฌ ๋ ธ๋์ ๊ฐ๋ณด๋ค ํฌ๋ฉด node ๋ณ์๋ฅผ node์ ์ค๋ฅธ์ชฝ ์์์ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝ
node๊ฐ ๋จ๋ง ๋ ธ๋๊น์ง ๋ด๋ ค๊ฐ์ null ๊ฐ์ด ๋ ๋๊น์ง ๋ฐ๋ณต
๋ง์ฝ ๋ฐ๋ณต์ด ์ข ๋ฃ๋์๋๋ฐ๋ ์์ง ํจ์๊ฐ ๋ฆฌํด๋์ง ์์๋ค๋ฉด ํ์์ด ์คํจํ ๊ฒ์ผ๋ก null ๋ฐํ
์ฝ๋๊ตฌํ
// ๋ฐ๋ณต์ ์ธ ํ์
public static Node repetitiveSearch(Node node, int key) {
while(node != null) {
if(key == node.data) {
return node;
} else if(key < node.data) {
node = node.left;
} else {
node = node.right;
}
}
return null; // ํ์ ์คํจํ์ ๊ฒฝ์ฐ
}
์ด์ง ํ์ ํธ๋ฆฌ์์์ ์ฝ์ ์ฐ์ฐ
์์๋ฅผ ์ฝ์ ํ๊ธฐ ์ํด์๋ ๋จผ์ ํ์์ ์ํํด์ผ ํ๋ค.
์ด์ง ํ์ ํธ๋ฆฌ์์๋ ๊ฐ์ ํค๊ฐ์ ๊ฐ๋ ๋ ธ๋๊ฐ ์์ด์ผ ํ๊ณ , ํ์์ ์คํจํ ์์น๊ฐ ๋ฐ๋ก ์๋ก์ด ๋ ธ๋๋ฅผ ์ฝ์ ํ๋ ์์น๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด, 9๋ฅผ ์ฝ์ ํ๋ ๊ฒฝ์ฐ ๋ฃจํธ(18)์์ ๋ถํฐ 9๋ฅผ ํ์ํ๋ค.
ํธ๋ฆฌ์์ 9๊ฐ ์๋ค๋ฉด ํ์ ์ฑ๊ณต > ์ค๋ณต > ์ฝ์ ๋ถ๊ฐ
ํธ๋ฆฌ์์ 9๊ฐ ์๋ค๋ฉด ํ์ ์คํจ > ํ์ ์คํจํ ์์น(๊ทธ๋ฆผ์์๋ 12)๊ฐ 9๊ฐ ์ฝ์ ๋ ์๋ฆฌ
๋ฐ๋ผ์ ์ ๊ทธ๋ฆผ์์ 9๋ 12์ ํ์ ์ผ์ชฝ ๋ ธ๋๋ก ์ถ๊ฐ๋๋ค.
์๋ก์ด ๋ ธ๋๋ ํญ์ ๋จ๋ง ๋ ธ๋์ ์ถ๊ฐ๋๋ค.
๋จ๋ง ๋ ธ๋๋ฅผ ๋ฐ๊ฒฌํ ๋๊น์ง ๋ฃจํธ์์ key๋ฅผ ๊ฒ์ํ๋ค.
๋จ๋ง ๋ ธ๋๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ์๋ก์ด ๋ ธ๋๊ฐ ๋จ๋ง ๋ ธ๋์ ํ์ ๋ ธ๋๋ก ์ถ๊ฐ๋๋ค.
์ฌ๊ธฐ์ ๋จ๋ง ๋ ธ๋๋? ๋ค๋ฅธ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด์์ง ์์ ๋ ธ๋(์ ๊ทธ๋ฆผ์์๋ 3, 12, 27 ์ด ํด๋น๋จ)๋ฅผ ๋งํ๋ค.
์ฝ๋๊ตฌํ
// ๋
ธ๋ ์ฝ์
public Node insertNode(Node node, int key) {
if(node == null) {
return new Node(key); // ๋
ธ๋๊ฐ ๋น ๊ฒฝ์ฐ, ์๋ก์ด ๋
ธ๋ ์ฝ์
ํ ๋ฐํ
}
// ๊ทธ๋ ์ง ์์ผ๋ฉด ์ํ์ ์ผ๋ก ํธ๋ฆฌ๋ฅผ ๋ด๋ ค๊ฐ
if(key < node.data) {
node.left = insertNode(node.left, key);
} else if(key > node.data) {
node.right = insertNode(node.right, key);
}
// ์ฝ์
์๋ฃ ํ, ๋ฃจํธ ๋
ธ๋ ๋ฐํํ๋ฉฐ ๋
return node;
}
์ด์ง ํ์ ํธ๋ฆฌ์์์ ์ญ์ ์ฐ์ฐ
์ด์ง ํ์ ํธ๋ฆฌ์์ ๊ฐ์ฅ ๋ณต์กํ ์ฐ์ฐ์ด๋ค.
์ญ์ ํ๊ธฐ ์ํด์ ๋จผ์ ๋ ธ๋๋ฅผ ํ์ํด์ผ ํ๋ค.
ํ์ ํ์๋ 3๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
- ์ญ์ ํ๋ ค๋ ๋ ธ๋๊ฐ ๋จ๋ง ๋ ธ๋์ผ ๊ฒฝ์ฐ
- ์ญ์ ํ๋ ค๋ ๋ ธ๋๊ฐ ํ๋์ ์๋ธ ํธ๋ฆฌ๋ง(์ผ์ชฝ or ์ค๋ฅธ์ชฝ) ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ
- ์ญ์ ํ๋ ค๋ ๋ ธ๋๊ฐ ๋ ๊ฐ์ ์๋ธ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ
1. ์ญ์ ํ๋ ค๋ ๋ ธ๋๊ฐ ๋จ๋ง ๋ ธ๋์ผ ๊ฒฝ์ฐ
๋จ๋ง ๋ ธ๋ ์๋์๋ ๋ ์ด์์ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก ๋จ๋ง ๋ ธ๋๋ง ์ง์ฐ๋ฉด ๋๋ค.
๋จ๋ง ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ฐพ์์ ๋ถ๋ชจ ๋ ธ๋์ ๋งํฌ ํ๋๋ฅผ null๋ก ๋ง๋ค์ด ์ฐ๊ฒฐ์ ๋๋๋ค.
2. ์ญ์ ํ๋ ค๋ ๋ ธ๋๊ฐ ํ๋์ ์๋ธ ํธ๋ฆฌ๋ง ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ
์๊ธฐ ๋ ธ๋๋ ์ญ์ ํ๊ณ , ์๋ธ ํธ๋ฆฌ๋ ์๊ธฐ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
3. ์ญ์ ํ๋ ค๋ ๋ ธ๋๊ฐ ๋ ๊ฐ์ ์๋ธ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ
์ด๋ค ๋ ธ๋๋ฅผ ์ญ์ ๋ ธ๋ ์์น๋ก ๊ฐ์ ธ์ฌ ๊ฒ์ด๋๊ฐ ์ค์ํ๋ค.
์ญ์ ๋๋ ๋ ธ๋์ ๊ฐ์ฅ ๊ฐ์ด ๋น์ทํ ๋ ธ๋๋ฅผ ํ๊ณ์๋ก ์ ํํด์ผ ์ด์ง ํ์ ํธ๋ฆฌ๊ฐ ๊ทธ๋๋ก ์ ์ง๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฅ ๊ฐ์ด ๊ฐ๊น์ด ๋ ธ๋๋?
์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์์ ๊ฐ์ฅ ํฐ ๊ฐ์ด๋ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๊ฐ์ด ์ญ์ ๋๋ ๋ ธ๋์ ๊ฐ์ฅ ๊ฐ๊น๋ค.
- ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์ ๊ฐ์ฅ ํฐ ๊ฐ - ์ผ์ชฝ ์๋ธํธ๋ฆฌ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์๋ ๋ ธ๋
- ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๊ฐ - ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ ธ๋
์ด ๋ ๋ ธ๋๋ ์ด์ง ํ์ ํธ๋ฆฌ๋ฅผ ์ค์ ์ํํ์์ ๊ฒฝ์ฐ, ๊ฐ๊ฐ ์ ํ ๋ ธ๋์ ํ์ ๋ ธ๋์ ํด๋นํ๋ค.
์๋ฅผ ๋ค์ด ์ญ์ ๋ ธ๋๊ฐ 18์ผ ๊ฒฝ์ฐ, ํ๊ณ์๊ฐ ๋ ์ ์๋ ๋ ธ๋๋ 12์ 22๊ฐ ๋๋ค.
18 ์๋ฆฌ๋ก ๋ ๋ ธ๋๋ฅผ ์ฎ๊ฒจ๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์ผ์ด๋์ง ์์
์ด ๋ ํ๊ณ์ ์ค์์ ์ด๋ค ๋ ธ๋๋ฅผ ์ ํํด์ผ ํ ๊น?
์๊ด์๋ค. ์ง๊ธ์ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๊ฐ์ ํ๊ณ์๋ก ์ ํด๋ณด์.
์ญ์ ๋๋ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐ๋ ๋ ธ๋๋
์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์์ ์ผ์ชฝ ์์ ๋ ธ๋๋ฅผ ํ๊ณ null์ ๋ง๋ ๋๊น์ง ๊ณ์ ํ๊ณ ๋ด๋ ค๊ฐ๋ฉด ์ฐพ์ ์ ์๋ค.
์ต์ข ์ ์ผ๋ก 22๊ฐ ํ๊ณ์๊ฐ ๋๊ณ , 22๊ฐ 18์ ์๋ฆฌ๋ก ์ด๋๋๋ค.
์ฝ๋๊ตฌํ
// ๋
ธ๋ ์ญ์
public Node deleteNode(Node root, int key) {
if(root == null) {
return root;
}
if(key < root.data) { // ํค๊ฐ ๋ฃจํธ๋ณด๋ค ์๋ค๋ฉด, ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์ ์๋ ๊ฒ
root.left = deleteNode(root.left, key);
} else if(key > root.data) { // ํค๊ฐ ๋ฃจํธ๋ณด๋ค ํฌ๋ค๋ฉด, ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ์ ์๋ ๊ฒ
root.right = deleteNode(root.right, key);
} else { // ํค๊ฐ ๋ฃจํธ์ ๊ฐ๋ค๋ฉด ์ด ๋
ธ๋๊ฐ ๋ฐ๋ก ์ญ์ ํ ๋
ธ๋
if(root.left == null) { // 1๋ฒ, 2๋ฒ์ ๊ฒฝ์ฐ - 1. ๋จ๋ง ๋
ธ๋์ธ ๊ฒฝ์ฐ / 2. ํ๋์ ์๋ธํธ๋ฆฌ๋ง ์๋ ๊ฒฝ์ฐ
return root.right; // ๋ ๊ฐ์ด๋ฉด ๋ ๋ฐํ / ์ค๋ฅธ์ชฝ ์์ผ๋ฉด ์ค๋ฅธ์ชฝ ๋ฐํํด์ ์ด์ ์ if, else if์์์ ์ผ์ชฝ์ด๋ ์ค๋ฅธ์ชฝ ๋
ธ๋์ ๋ถ์ฌ์ฃผ๋ ๊ฒ
} else if(root.right == null) {
return root.left; // left๊ฐ ๋์ธ ๊ฒฝ์ฐ์ ๋์ผ
}
// 3๋ฒ์ ๊ฒฝ์ฐ - 3. ๋๊ฐ์ ์๋ธ ํธ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ (left, right ๋ ๋ค null ์๋
Node temp = minValueNode(root.right); // ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๊ฐ(๊ฐ์ฅ ์ผ์ชฝ ๋
ธ๋)๊ฐ ํ๊ณ ๋
ธ๋
root.data = temp.data; // ํ๊ณ ๋
ธ๋ ๊ฐ ๋ณต์ฌ(์ญ์ ํ ๋
ธ๋์ ๊ฐ์ ํ๊ณ ๋
ธ๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
root.right = deleteNode(root.right, temp.data); // ํ๊ณ ๋
ธ๋ ์ญ์ - ์ค๋ฅธ์ชฝ ๋
ธ๋์๊ฒ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐ์ก๋ ๋งจ ์ผ์ชฝ ๋จ๋ง๋
ธ๋๋ฅผ ๋ค์ deleteNode๋ฅผ ํธ์ถํด ์ญ์ ํ๋ผ๊ณ ํจ
}
return root;
}
// ํ๊ณ ๋
ธ๋ ์ฐพ๊ธฐ - ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐ์ง๋ ๋
ธ๋ ๋ฐํ
public Node minValueNode(Node node) {
Node currentNode = node;
while(currentNode.left != null) {
currentNode = currentNode.left; // ๋งจ ์ผ์ชฝ ๋จ๋ง ๋
ธ๋๋ฅผ ์ฐพ์ผ๋ฌ ๋ด๋ ค๊ฐ
}
return currentNode;
}
// ํ๊ณ ๋
ธ๋ ์ฐพ๊ธฐ - ์ผ์ชฝ ์๋ธํธ๋ฆฌ์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ์ง๋ ๋
ธ๋ ๋ฐํ
public Node maxValueNode(Node node) {
Node currentNode = node;
while(currentNode.right != null) {
currentNode = currentNode.right; // ๋งจ ์ค๋ฅธ์ชฝ ๋จ๋ง ๋
ธ๋๋ฅผ ์ฐพ์ผ๋ฌ ๋ด๋ ค๊ฐ
}
return currentNode;
}
๋ค์์ผ๋ก ์ด์งํธ๋ฆฌ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ๋ค.
์ด์งํธ๋ฆฌ ํ์๋ฐฉ๋ฒ
์ด์ง ํธ๋ฆฌ(Binary Tree)๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ ๋ค์์ 4๊ฐ์ง๊ฐ ์๋ค.
- ์ ์์ํ(Preorder Traversal) : VLR
- ์ค์์ํ(Inorder Traversal) : LVR
- ํ์์ํ(Postorder Traversal) : LRV
- ๋ ๋ฒจ์ํ(Levelorder Traversal) ๋๋ BFS(Breadth-First Search; ๋๋น ์ฐ์ ํ์)
์ฌ๊ธฐ์ V๋ ๋ฃจํธ๋ฅผ ๋ฐฉ๋ฌธ, L์ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ ๋ฐฉ๋ฌธ, R์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธ ํ๋ ์์ ์ด๋ค.
๋ ๋ฒจ์ํ(;BFS)๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ํ๋ฐฉ์์ DFS(Depth-First Search; ๊น์ด ์ฐ์ ํ์)์ผ๋ก ๋ถ๋ฅํ ์ ์๋ค.
์ ์์ํ(preorder traversal)
์ ์์ํ๋ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ํ๊ณ , ์์ ๋ ธ๋๋ฅผ ํ์ํ๋ ๋ฐฉ์์ด๋ค.
public void preOrder(Node node) {
if(node != null) {
System.out.print(node.data + " ");
if(node.left != null) preOrder(node.left);
if(node.right != null) preOrder(node.right);
}
}
์ค์์ํ(inorder traversal)
์ค์์ํ๋ ์ผ์ชฝ ์์ ๋ ธ๋๋ฅผ ํ์ํ๊ณ , ๋ฃจํธ ๋ ธ๋๋ฅผ ํ์ํ๊ณ , ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ฅผ ํ์ํ๋ ๋ฐฉ์์ด๋ค.
//์ค์ ์ํ Inorder : Left -> Root -> Right
public void inOrder(Node node) {
if(node != null) {
if(node.left != null) inOrder(node.left);
System.out.print(node.data + " ");
if(node.right != null) inOrder(node.right);
}
}
ํ์์ํ(postorder traversal)
ํ์์ํ๋ ์ผ์ชฝ ์์ ๋ ธ๋๋ฅผ ํ์ํ๊ณ , ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ฅผ ํ์ํ๊ณ , ๋ฃจํธ ๋ ธ๋๋ฅผ ํ์ํ๋ ๋ฐฉ์์ด๋ค.
//ํ์์ํ Postorder : Left -> Right -> Root
public void postOrder(Node node) {
if(node != null) {
if(node.left != null) postOrder(node.left);
if(node.right != null) postOrder(node.right);
System.out.print(node.data + " ");
}
}
๐์ฐธ๊ณ ์ฌ์ดํธ
์๋ฐ [JAVA] - Binary Search Tree (์ด์ง ํ์ ํธ๋ฆฌ) ๊ตฌํํ๊ธฐ
[Java] ํธ๋ฆฌ Tree 3 - ์ด์ง ํ์ ํธ๋ฆฌ
[Java] ํธ๋ฆฌ Tree 2 - ์ด์ง ํธ๋ฆฌ์ ์ํ(์ ์, ์ค์, ํ์, ๋ฐ๋ณต, ๋ ๋ฒจ) / ๊ตฌํ
'Algorithm > KBro Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] Brute Force(๋ธ๋ฃจํธ ํฌ์ค) (0) | 2023.01.08 |
---|---|
[์๋ฃ๊ตฌ์กฐ] B-tree, B+tree ์ด๋ก ์ ๋ฆฌ (0) | 2022.12.28 |
[์๋ฃ๊ตฌ์กฐ] Java - ํด์ํ ์ด๋ธ(HashTable) ์ด๋ก ์ ๋ฆฌ (0) | 2022.12.23 |
[์๋ฃ๊ตฌ์กฐ] Java - Heap(ํ) ์ด๋ก ์ ๋ฆฌ + ๊ตฌํ + Priority Queue(์ฐ์ ์์ ํ) (0) | 2022.12.11 |
[์๋ฃ๊ตฌ์กฐ] ์๋ฐ LinkedList(์ฐ๊ฒฐ๋ฆฌ์คํธ)? (0) | 2022.12.01 |