์ ํฌ์คํ ์์ ์์ฑํ Tree์ ๋นํจ์จ์ ์ธ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์๊ธด ์ด์ง ํ์ ํธ๋ฆฌ๋ค.
ํธ๋ฆฌ๋ ์ฌ๋ฌ ์์์ ๊ฐ์ง ์ ์์ง๋ง ์ด์ง ๊ฒ์ ํธ๋ฆฌ์์๋ Binary Tree์ ๊ฐ๋ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
์์์ด Left, Right๋ง ์กด์ฌํ๋ค. ์ด๋ฅผ ํตํด Log_2 (N) ๋ฒ๋ง์ ๋ชจ๋ ์ํ์ ๋๋ผ ์ ์๋ค.
๋, inorder๋ฅผ ์ํ ์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
package com.study.datastructrue.nonlinear.binarysearchtree;
public class Node {
int value;
Node left;
Node right;
public Node(int value) {
this.value = value;
left = null;
right = null;
}
}
๊ธฐ๋ณธ ์ ์ธ ๋ ธ๋ ์ ๋ณด์ด๋ค.
package com.study.datastructrue.nonlinear.binarysearchtree;
public class LinkedListBST {
private Node root;
private int size;
public LinkedListBST() {
this.root = null;
this.size = 0;
}
public void add(int value) {
this.root = addRecursive(root, value);
this.size++;
}
private Node addRecursive(Node current, int value) {
if (current == null) {
return new Node(value);
}
if (value < current.value) {
current.left = addRecursive(current.left, value);
} else if (value > current.value) {
current.right = addRecursive(current.right, value);
}
return current;
}
public boolean delete(int value) {
int originalSize = size;
this.root = deleteRecursive(root, value);
return size < originalSize;
}
private Node deleteRecursive(Node current, int value) {
if (current == null) {
return null;
}
if (value == current.value) {
if (current.left == null && current.right == null) {
size--;
return null;
}
if (current.left == null) {
size--;
return current.right;
}
if (current.right == null) {
size--;
return current.left;
}
int smallestValue = findSmallestValue(current.right);
current.value = smallestValue;
current.right = deleteRecursive(current.right, smallestValue);
return current;
}
if (value < current.value) {
current.left = deleteRecursive(current.left, value);
return current;
}
current.right = deleteRecursive(current.right, value);
return current;
}
private int findSmallestValue(Node root) {
return root.left == null ? root.value : findSmallestValue(root.left);
}
public void printTree() {
printTree(root, 0);
}
private void printTree(Node node, int level) {
if (node == null) {
return;
}
printTree(node.right, level + 1);
if (level != 0) {
for (int i = 0; i < level - 1; i++) {
System.out.print("|\t");
}
System.out.println("|-------" + node.value);
} else {
System.out.println(node.value);
}
printTree(node.left, level + 1);
}
public void traverseInOrder() {
traverseInOrder(root);
System.out.println();
}
private void traverseInOrder(Node node) {
if (node != null) {
traverseInOrder(node.left);
System.out.print(" " + node.value);
traverseInOrder(node.right);
}
}
public void traversePreOrder() {
traversePreOrder(root);
System.out.println();
}
private void traversePreOrder(Node node) {
if (node != null) {
System.out.print(" " + node.value);
traversePreOrder(node.left);
traversePreOrder(node.right);
}
}
public void traversePostOrder() {
traversePostOrder(root);
System.out.println();
}
private void traversePostOrder(Node node) {
if (node != null) {
traversePostOrder(node.left);
traversePostOrder(node.right);
System.out.print(" " + node.value);
}
}
public int size() {
return size;
}
}
1. ์์ ๊ฐ์ ์ผ์ชฝ ์์์ผ๋ก ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ ์์์ผ๋ก ์ถ๊ฐํ๋ค.
( ์ค๋ณต๋ ๊ฐ์ ํ์ฉํ ๊ฒฝ์ฐ, count๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์๋ค.)
2. ์ญ์ ์ ๊ณ ๋ คํ ์ ์ด ์๋ค.
- ์ญ์ ํ ๊ฐ์ ์ฐพ์์ ๊ฒฝ์ฐ,
1) ์์์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด ๋ด๊ฐ ์ง์์ง ๊ฒ์ด๋ null์ ๋ฐํ
2) ์ผ์ชฝ ์์์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ค๋ฅธ์ชฝ ์์์ ๋ฐํํด์ฃผ์ด์ Level์ ๋ง์ถค.
3) ์ค๋ฅธ์ชฝ ์์์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ผ์ชฝ ์์์ ๋ฐํํด์ฃผ์ด์ Level์ ๋ง์ถค.
4) ์์์ด ๋ ๋ค ์กด์ฌํ๋ค๋ฉด ํฐ ๋ ์ ์ค ๊ฐ์ฅ ์์ ๋ ์์ผ๋ก ๊ต์ฒดํด์ฃผ์ด์ผ ํจ. inorder์ ํน์ฑ์ ๋ง์ถ๊ธฐ ์ํจ.
4๋ฅผ ์ง์ด ํ์๋ InOrder ๊ฒฐ๊ณผ๊ฐ ์ค๋ฆ์ฐจ์ ์ธ ๊ฒ์ ๋ณผ ์ ์์.
package com.study.datastructrue.nonlinear.binarysearchtree;
public class ArrayBST {
private int[] tree;
private int size;
public ArrayBST(int capacity) {
tree = new int[capacity];
size = 0;
for (int i = 0; i < capacity; i++) {
tree[i] = Integer.MIN_VALUE;
}
}
public void add(int value) {
if (size == 0) {
tree[0] = value;
size++;
} else {
addRecursive(0, value);
}
}
private void addRecursive(int index, int value) {
if (tree[index] == Integer.MIN_VALUE) {
tree[index] = value;
size++;
} else if (value < tree[index]) {
int leftChildIndex = 2 * index + 1;
addRecursive(leftChildIndex, value);
} else if (value > tree[index]) {
int rightChildIndex = 2 * index + 2;
addRecursive(rightChildIndex, value);
}
}
public void printTree() {
printTreeRecursive(0, 0);
}
private void printTreeRecursive(int index, int level) {
if (index >= tree.length || tree[index] == Integer.MIN_VALUE) {
return;
}
printTreeRecursive(2 * index + 2, level + 1);
for (int i = 0; i < level; i++) {
System.out.print(" ");
}
System.out.println(tree[index]);
printTreeRecursive(2 * index + 1, level + 1);
}
}
BST๋ LinkedList ๋ฟ๋ง ์๋๋ผ Array๋ก๋ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
package com.study.datastructrue.nonlinear.binarysearchtree;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
LinkedListBST bt = new LinkedListBST();
bt.add(6);
bt.add(4);
bt.add(8);
bt.add(3);
bt.add(5);
bt.add(7);
bt.add(9);
bt.printTree();
bt.traversePreOrder();
bt.traverseInOrder();
bt.traversePostOrder();
bt.delete(4);
bt.printTree();
bt.traverseInOrder();
ArrayBST bst = new ArrayBST(10);
bst.add(6);
bst.add(4);
bst.add(8);
bst.add(3);
bst.add(5);
bst.add(7);
bst.add(9);
bst.printTree();
}
}
Java์์๋ Tree๋ฅผ ๊ตฌํํด ๋ ๊ฒ์ด ์๋๋ฐ ๋ฐ๋ก TreeSet ๊ณผ TreeMap ์ด๋ค.
ํ์ง๋ง Java์ Tree๋ Red-Black Tree๋ก ์๊ฐ๊ท ํํธ๋ฆฌ๋ผ๊ณ ๋ ํ๋ค.
์ด๊ฒ์ ์ด์ง ํธ๋ฆฌ ์ข ๋ฅ ์ค ๊ท ํํธ๋ฆฌ๋ผ๋ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋์ธ๋ฐ ๋ค์ ํฌ์คํธ์ ์ค๋ช ํ๊ฒ ๋ค.
'์๊ณ ๋ฆฌ์ฆ > ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Graph (Adjacency Matrix, Adjacency List) (0) | 2024.07.09 |
---|---|
[Java] Binary Tree (0) | 2024.07.08 |
[Java] Tree (0) | 2024.07.07 |
6. STL ์ฌ์ฉํ๊ธฐ - std::list (0) | 2024.02.11 |
5. ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ (Circular Linked List) (1) | 2024.02.10 |