1οΈβ£ μ΄μ§ νΈλ¦¬(Binary Tree).
μ΄μ§ νΈλ¦¬(Binary Tree) λ κ° λ Έλκ° μ΅λ λ κ°μ μμ λ Έλλ₯Ό κ°μ§ μ μλ νΈλ¦¬ ꡬ쑰μ λλ€.
μ΄ λ μμ λ Έλλ μΌλ°μ μΌλ‘ μΌμͺ½ μμ(Left Child) κ³Ό μ€λ₯Έμͺ½ μμ(Right Child) μ΄λΌκ³ λΆλ¦½λλ€.
μ΄μ§ νΈλ¦¬λ λ€μν μμ© νλ‘κ·Έλ¨μμ μ€μν μλ£κ΅¬μ‘°μ λλ€.
1οΈβ£ μ΄μ§ νΈλ¦¬μ κ΅¬μ± μμ.
- λ Έλ(Node) : λ°μ΄ν°λ₯Ό μ μ₯νλ κΈ°λ³Έ λ¨μμ λλ€.
- 루νΈ(Root) : νΈλ¦¬μ μ΅μμ λ Έλμ λλ€.
- μμ(Child) : νΉμ λ Έλλ‘λΆν° μ°κ²°λ νμ λ Έλμ λλ€.
- λΆλͺ¨(Parent) : νΉμ λ Έλλ₯Ό κ°λ¦¬ν€λ μμ λ Έλμ λλ€.
- μ(Leaf) : μμ λ Έλκ° μλ λ Έλμ λλ€.
- μλΈνΈλ¦¬(Subtree) : νΉμ λ Έλμ κ·Έ λ Έλμ λͺ¨λ μμ λ Έλλ‘ κ΅¬μ±λ νΈλ¦¬μ λλ€.
2οΈβ£ μ΄μ§ νΈλ¦¬μ μ’ λ₯.
-
ν¬ν μ΄μ§ νΈλ¦¬(Full Binary Tree) : λͺ¨λ λ Έλκ° 0κ° λλ 2κ°μ μμ λ Έλλ₯Ό κ°μ§λ νΈλ¦¬μ λλ€.
-
μμ μ΄μ§ νΈλ¦¬(Complete Binary Tree) : λ§μ§λ§ λ 벨μ μ μΈν λͺ¨λ λ λ²¨μ΄ μμ ν μ±μμ Έ μμΌλ©°, λ§μ§λ§ λ 벨μ λ Έλλ μΌμͺ½λΆν° μ±μμ Έ μλ νΈλ¦¬μ λλ€.
-
λμ΄ κ· ν μ΄μ§ νΈλ¦¬(Height-balanced binary Tree) : AVL νΈλ¦¬μ κ°μ΄ κ° λ Έλμ μΌμͺ½ μλΈνΈλ¦¬μ μ€λ₯Έμͺ½ μλΈνΈλ¦¬μ λμ΄ μ°¨μ΄κ° 1 μ΄νμΈ νΈλ¦¬μ λλ€.
-
μ΄μ§ νμ νΈλ¦¬(Binary Search Tree, BST) : μΌμͺ½ μλΈνΈλ¦¬μ λͺ¨λ λ Έλκ° λ£¨νΈ λ Έλλ³΄λ€ μκ³ , μ€λ₯Έμͺ½ μλΈ νΈλ¦¬μ λͺ¨λ λ Έλκ° λ£¨νΈ λ Έλλ³΄λ€ ν° νΈλ¦¬μ λλ€.
3οΈβ£ μ΄μ§ νΈλ¦¬μ μ£Όμ μ°μ° λ° μκ° λ³΅μ‘λ.
-
μ½μ
(Insertion) : μλ‘μ΄ λ
Έλλ₯Ό νΈλ¦¬μ μΆκ°ν©λλ€.
- μΌλ°μ μΈ κ²½μ° μκ° λ³΅μ‘λ : O(log n)(μ΄μ§ νμ νΈλ¦¬μμ)
- μ΅μ μ κ²½μ° μκ° λ³΅μ‘λ : O(n)(νΈν₯λ νΈλ¦¬μμ)
-
μμ (Deletion) : νΈλ¦¬μμ νΉμ λ
Έλλ₯Ό μ κ±°ν©λλ€.
- μΌλ°μ μΈ κ²½μ° μκ° λ³΅μ‘λ : O(log n)(μ΄μ§ νμ νΈλ¦¬μμ)
- μ΅μ μ κ²½μ° μκ° λ³΅μ‘λ: O(n)(νΈν₯λ νΈλ¦¬μμ)
-
νμ(Search) : νΈλ¦¬μμ νΉμ κ°μ μ°Ύμ΅λλ€.
- μΌλ°μ μΈ κ²½μ° μκ° λ³΅μ‘λ: O(log n)(μ΄μ§ νμ νΈλ¦¬μμ)
- μ΅μ μ κ²½μ° μκ° λ³΅μ‘λ : O(n)(νΈν₯λ νΈλ¦¬μμ)
-
μν(Traversal) : νΈλ¦¬μ λͺ¨λ λ
Έλλ₯Ό λ°©λ¬Έν©λλ€. μν λ°©λ²μλ μ μ(Preorder), μ€μ(Inorder), νμ(Postorder) μνκ° μμ΅λλ€.
- μκ° λ³΅μ‘λ: O(n)(λͺ¨λ λ Έλλ₯Ό λ°©λ¬ΈνκΈ° λλ¬Έμ)
4οΈβ£ μ΄μ§ νΈλ¦¬μ μμ
μ΄μ§ νμ νΈλ¦¬(BST)μ ꡬν
// TreeNode
public class TreeNode {
int data;
TreeNode left;
TreeNode right;
public TreeNode(int data) {
this.data = data;
this.left = null;
this.right = null;
}
}
// BinarySearchTree
public class BinarySearchTree {
private TreeNode root;
public BinarySearchTree() {
this.root = null;
}
// μ½μ
μ°μ°
public void insert(int data) {
root = insertRec(root, data);
}
private TreeNode insertRec(TreeNode root, int data) {
if (root == null) {
root = new TreeNode(data);
return root;
}
if (data < root.data) {
root.left = insertRec(root.left, data);
} else if (data > root.data) {
root.right = insertRec(root.right, data);
}
return root;
}
// νμ μ°μ°
public boolean search(int data) {
return searchRec(root, data);
}
private boolean searchRec(TreeNode root, int data) {
if (root == null) {
return false;
}
if (root.data == data) {
return true;
}
if (data < root.data) {
return searchRec(root.left, data);
} else {
return searchRec(root.right, data);
}
}
// μ€μ μν(Inorder Traversal)
public void inorder() {
inorderRec(root);
}
private void inorderRec(TreeNode root) {
if (root != null) {
inorderRec(root.left);
System.out.print(root.data + " ");
inorderRec(root.right);
}
}
}
// Main
public class Main {
public static void main(String[] args) {
BinarySearchTree bst = new BinarySearchTree();
bst.insert(50);
bst.insert(30);
bst.insert(20);
bst.insert(40);
bst.insert(70);
bst.insert(60);
bst.insert(80);
System.out.println("Inorder traversal of the BST:");
bst.inorder(); // μΆλ ₯: 20 30 40 50 60 70 80
System.out.println("\nSearch for 40: " + bst.search(40)); // μΆλ ₯: true
System.out.println("Search for 90: " + bst.search(90)); // μΆλ ₯: false
}
}