1๏ธโฃ ์์ ์ด์ง ํธ๋ฆฌ(Complete Binary Tree).
์์ ์ด์ง ํธ๋ฆฌ(Complete Binary Tree)๋ ์ด์ง ํธ๋ฆฌ์ ํ ์ข ๋ฅ์ ๋๋ค.
1๏ธโฃ ์์ ์ด์ง ํธ๋ฆฌ(Complete Binary Tree)์ ํน์ฑ.
-
๋ชจ๋ ๋ ๋ฒจ์ด ์์ ํ ์ฑ์์ ธ ์๋ค.
- ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ ๋ชจ๋ ๋ ๋ฒจ์ ๋ ธ๋๊ฐ ์ต๋ ๊ฐ์๋ก ์ฑ์์ ธ ์์ต๋๋ค.
- ๋ง์ง๋ง ๋ ๋ฒจ์ ๋ ธ๋๋ค์ ์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฑ์์ ธ ์์ต๋๋ค.
-
๋
ธ๋์ ๋ฐฐ์น
- ํธ๋ฆฌ์ ๋์ด๊ฐ โhโ ๋ผ๋ฉด, ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ ๋ชจ๋ ๋ ๋ฒจ์๋ โ2^kโ ๊ฐ์ ๋ ธ๋๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ โkโ ๋ ํด๋น ๋ ๋ฒจ์ ๊น์ด ์ ๋๋ค.
- ๋ง์ง๋ง ๋ ๋ฒจ์๋ 1๊ฐ ์ด์ โ2^hโ ๊ฐ ์ดํ์ ๋ ธ๋๊ฐ ์์ผ๋ฉฐ, ์ด ๋ ธ๋๋ค์ ์ผ์ชฝ๋ถํฐ ์ฑ์์ง๋๋ค.
2๏ธโฃ ์์ ์ด์น ํธ๋ฆฌ์ ์.
1
/ \
2 3
/ \ / \
4 5 6 7
/ \
8 9
์์ ํธ๋ฆฌ๋ ์์ ์ด์ง ํธ๋ฆฌ์ ์์ ๋๋ค.
๋ชจ๋ ๋ ๋ฒจ์ด ์์ ํ ์ฑ์์ ธ ์๊ณ , ๋ง์ง๋ง ๋ ๋ฒจ์ ๋ ธ๋๋ค์ ์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฑ์์ ธ์์ต๋๋ค.
3๏ธโฃ ์์ ์ด์ง ํธ๋ฆฌ์ ์์ฑ.
-
๋
ธ๋ ์
- ๋์ด๊ฐ โhโ ์ธ ์์ ์ด์ง ํธ๋ฆฌ๋ ์ต๋ โ2^(h+1) - 1โ ๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ ๋ชจ๋ ๋ ธ๋๋ โ2^h - 1โ ๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง๋๋ค.
-
๋์ด
- ๋ ธ๋ ์๊ฐ โnโ ์ธ ์์ ์ด์ง ํธ๋ฆฌ์ ๋์ด๋ โO(log n)โ ์ ๋๋ค.
-
๋ฐฐ์ด ํํ
- ์์ ์ด์ง ํธ๋ฆฌ๋ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ํํํ ์ ์์ต๋๋ค. ์ด๋ ํ ์๋ฃ๊ตฌ์กฐ์์ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
4๏ธโฃ ๋ฐฐ์ด์ ํตํ ์์ ์ด์ง ํธ๋ฆฌ ํํ
์์ ์ด์ง ํธ๋ฆฌ๋ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ํํํ ์ ์์ต๋๋ค.
๋ ธ๋์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์์ต๋๋ค.
๋ ธ๋์ ์ธ๋ฑ์ค ๊ท์น
- ๋ฃจํธ ๋ ธ๋ : ์ธ๋ฑ์ค 0
- ์ธ๋ฑ์ค โiโ์ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ : โ2*i + 1โ
- ์ธ๋ฑ์ค โiโ์ ๋ถ๋ชจ ๋ ธ๋ : โ(i - 1) / 2โ
5๏ธโฃ ์์ ์ฝ๋
์๋๋ ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๋ฐฐ์ด๋ก ํํํ๊ณ , ์ด๋ฅผ ์ถ๋ ฅํ๋ ๊ฐ๋จํ ์์ ์ฝ๋์ ๋๋ค.
public class CompleteBinaryTree {
public static void main(String[] args) {
int[] tree = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// ํธ๋ฆฌ ์ถ๋ ฅ
printTree(tree);
}
// ๋ฐฐ์ด๋ก ํํ๋ ์์ ์ด์ง ํธ๋ฆฌ ์ถ๋ ฅ
public static void printTree(int[] tree) {
for (int i = 0; i < tree.length; i++) {
int leftChildIndex = 2 * i + 1;
int rightChildIndex = 2 * i + 2;
System.out.print("Node " + tree[i] + ": ");
if (leftChildIndex < tree.length) {
System.out.print("Left Child: " + tree[leftChildIndex] + ", ");
} else {
System.out.print("Left Child: null, ");
}
if (rightChildIndex < tree.length) {
System.out.print("Right Child: " + tree[rightChildIndex]);
} else {
System.out.print("Right Child: null");
}
System.out.println();
}
}
}
/* ์ถ๋ ฅ
Node 1: Left Child: 2, Right Child: 3
Node 2: Left Child: 4, Right Child: 5
Node 3: Left Child: 6, Right Child: 7
Node 4: Left Child: 8, Right Child: 9
Node 5: Left Child: null, Right Child: null
Node 6: Left Child: null, Right Child: null
Node 7: Left Child: null, Right Child: null
Node 8: Left Child: null, Right Child: null
Node 9: Left Child: null, Right Child: null
*/
์ค๋ช
-
ํธ๋ฆฌ ๋ฐฐ์ด ์ด๊ธฐํ :
int[] tree = {1, 2, 3, 4, 5, 6, 7, 8, 9};
- ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๋ฐฐ์ด๋ก ํํํฉ๋๋ค.
-
ํธ๋ฆฌ ์ถ๋ ฅ :
printTree(tree)
- ๋ฐฐ์ด๋ก ํํ๋ ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ ํจ์์ ๋๋ค.
- ๊ฐ ๋ ธ๋์ ๋ํด ์ผ์ชฝ ์์๊ณผ ์ค๋ฅธ์ชฝ ์์์ ์ถ๋ ฅํฉ๋๋ค.
์๊ฐ ๋ณต์ก๋
- ์ฝ์ (Insertion) : O(log n)
- ์ญ์ (Deletion) : O(log n)
- ํ์(Search) : O(n) (์ผ๋ฐ์ ์ผ๋ก ์์ ์ด์ง ํธ๋ฆฌ๋ ํ์๋ณด๋ค ์ฝ์ /์ญ์ ๊ฐ ์ฃผ๋ ์ฐ์ฐ์ ๋๋ค.)
์์ ์ด์ง ํธ๋ฆฌ๋ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ์ ํน์ฑ ๋๋ฌธ์ ํ๊ณผ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์์ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ ํจ์จ์ ์ธ ์ฝ์ ๋ฐ ์ญ์ ์ฐ์ฐ์ ์ ๊ณตํ๋ฉฐ, ๋ฐฐ์ด์ ํตํ ํํ์ด ๊ฐํธํ์ฌ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.