[μλ£κ΅¬μ‘°] μ΄μ§ νμ νΈλ¦¬ ꡬν | Java
πμ΄μ§ νμ νΈλ¦¬λ?
μ΄μ§ νΈλ¦¬μ μμ±μ λ€μκ³Ό κ°λ€.
1. μ€λ³΅λ λ Έλκ° μμ΄μΌνλ€.
2. λͺ¨λ λ Έλμ μΌμͺ½ μλΈ νΈλ¦¬μλ ν΄λΉ λ Έλλ³΄λ€ μμ κ°μ μ§λ λ Έλλ€λ‘ μ΄λ£¨μ΄μ Έ μλ€.
3. λͺ¨λ λ Έλμ μ€λ₯Έμͺ½ μλΈ νΈλ¦¬μλ ν΄λΉ λ Έλλ³΄λ€ ν° κ°μ μ§λ λ Έλλ€λ‘ μ΄λ£¨μ΄μ Έ μλ€.
4. μ€λ³΅λ λ Έλκ° μμ΄μΌνλ€.
5. μΌμͺ½ μλΈνΈλ¦¬μ μ€λ₯Έμͺ½ μλΈνΈλ¦¬ λν μ΄μ§νμνΈλ¦¬μ΄λ€.
μ΄μ§νμνΈλ¦¬μ λ¨μ
μ΄μ§νμνΈλ¦¬μ μ½μ κ³Ό μμ μ°μ°μ νμμ΄ν μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ
νμμ νμν O(h)μ΄ μμλλ©° μ°κ²°λ¦¬μ€νΈλ₯Ό μ¬μ©νλ―λ‘ μ λ ₯κ³Ό μμ μλ O(1)μ΄ μ¬μ©λλ€.
λ°λΌμ μ΄ μμλλ μκ° λ³΅μ‘λλ O(h)μ΄λ©° μ΅μ μ κ²½μ° νμκ³Ό λμΌνκ² O(N)μ΄ μμλλ€.
λ€μκ³Ό κ°μ΄ μ΄μ§ νμ νΈλ¦¬λ νμͺ½ λ°©ν₯μΌλ‘ λ Έλκ° μ§μ€λ νΈν₯νΈλ¦¬μμλ ν¨μ¨μ μ΄μ§ μλ€.
μ΄λ¬ν λ¨μ μ 보μνκΈ° μν΄ Balance Treeλ₯Ό μ΄μ©νλλ°, B-Tree, AVL, Red-Black Tree λ±μ΄ μλ€.
Binary Search Tree visualization
https://www.cs.usfca.edu/~galles/visualization/BST.html
μ°Έκ³
https://ratsgo.github.io/data%20structure&algorithm/2017/10/22/bst/
πμ½λ
Node.java
package tree;
public class Node implements TreePrinter.PrintableNode{
Integer data;
Node left;
Node right;
@Override
public TreePrinter.PrintableNode getLeft() {
return this.left;
}
@Override
public TreePrinter.PrintableNode getRight() {
return this.right;
}
@Override
public String getText() {
return "["+data+"]";
}
public Node(Integer data) {
this.data = data;
this.left = null;
this.right = null;
}
}
BinarySearchTree.java
package tree;
public class BinarySearchTree {
static final int COUNT = 10;
Node root;
//μ½μ
λ©μλ
void add(Integer x){
Node newNode = new Node(x);
if(root == null) {
root = newNode;
}
else{
Node node = root;
while(true){
if(x > node.data) {
if(node.right == null) break;
node = node.right;
}
else if ( x < node.data) {
if(node.left == null) break;
node = node.left;
}
}
if(x > node.data) node.right = newNode;
else node.left = newNode;
}
}
//μμ λ©μλ
void remove(int x){
Node current = root;
Node node = root;
while(current.data != x){
if(x > current.data) {
if(x == current.right.data) {
node = current.right;
break;
}
current = current.right;
}
else {
if(x == current.left.data) {
node = current.left;
break;
}
current = current.left;
}
}
System.out.println(current.data);
System.out.println(node.data);
if(node.left == null && node.right == null) {
System.out.println("μ΄ λ
Έλλ μμμ΄ μμ");
// if(x > current.data)
}
else if (node.left != null && node.right != null){
System.out.println("μ΄ λ
Έλλ μμμ΄ λλ€ μμ");
}
else {
System.out.println("μ΄ λ
Έλλ μμμ΄ νλλ§ μμ");
}
}
//μ μ μν : μ-μΌ-μ€
void preOrder(Node node){
System.out.print(node.data + " ");
if(node.left != null) {
preOrder(node.left);
}
if(node.right != null){
preOrder(node.right);
}
}
//μ€μ μν: μΌ-μ-μ€
void inOrder(Node node){
if(node.left != null) inOrder(node.left);
System.out.print(node.data + " ");
if(node.right != null)inOrder(node.right);
}
//νμ μν: μΌ-μ€-μ
void postOrder(Node node){
if(node.left != null) postOrder(node.left);
if(node.right != null)postOrder(node.right);
System.out.print(node.data + " ");
}
}
TreePrinter.java - μ΄μ§ νΈλ¦¬ μΆλ ₯ μ½λ
package tree;
import java.util.ArrayList;
import java.util.List;
public class TreePrinter
{
/** Node that can be printed */
public interface PrintableNode
{
/** Get left child */
PrintableNode getLeft();
/** Get right child */
PrintableNode getRight();
/** Get text to be printed */
String getText();
}
/**
* Print a tree
*
* @param root
* tree root node
*/
public static void print(PrintableNode root)
{
List<List<String>> lines = new ArrayList<List<String>>();
List<PrintableNode> level = new ArrayList<PrintableNode>();
List<PrintableNode> next = new ArrayList<PrintableNode>();
level.add(root);
int nn = 1;
int widest = 0;
while (nn != 0) {
List<String> line = new ArrayList<String>();
nn = 0;
for (PrintableNode n : level) {
if (n == null) {
line.add(null);
next.add(null);
next.add(null);
} else {
String aa = n.getText();
line.add(aa);
if (aa.length() > widest) widest = aa.length();
next.add(n.getLeft());
next.add(n.getRight());
if (n.getLeft() != null) nn++;
if (n.getRight() != null) nn++;
}
}
if (widest % 2 == 1) widest++;
lines.add(line);
List<PrintableNode> tmp = level;
level = next;
next = tmp;
next.clear();
}
int perpiece = lines.get(lines.size() - 1).size() * (widest + 4);
for (int i = 0; i < lines.size(); i++) {
List<String> line = lines.get(i);
int hpw = (int) Math.floor(perpiece / 2f) - 1;
if (i > 0) {
for (int j = 0; j < line.size(); j++) {
// split node
char c = ' ';
if (j % 2 == 1) {
if (line.get(j - 1) != null) {
c = (line.get(j) != null) ? 'β΄' : 'β';
} else {
if (j < line.size() && line.get(j) != null) c = 'β';
}
}
System.out.print(c);
// lines and spaces
if (line.get(j) == null) {
for (int k = 0; k < perpiece - 1; k++) {
System.out.print(" ");
}
} else {
for (int k = 0; k < hpw; k++) {
System.out.print(j % 2 == 0 ? " " : "β");
}
System.out.print(j % 2 == 0 ? "β" : "β");
for (int k = 0; k < hpw; k++) {
System.out.print(j % 2 == 0 ? "β" : " ");
}
}
}
System.out.println();
}
// print line of numbers
for (int j = 0; j < line.size(); j++) {
String f = line.get(j);
if (f == null) f = "";
int gap1 = (int) Math.ceil(perpiece / 2f - f.length() / 2f);
int gap2 = (int) Math.floor(perpiece / 2f - f.length() / 2f);
// a number
for (int k = 0; k < gap1; k++) {
System.out.print(" ");
}
System.out.print(f);
for (int k = 0; k < gap2; k++) {
System.out.print(" ");
}
}
System.out.println();
perpiece /= 2;
}
}
}
BinarySearchTreeMain.java
package tree;
public class BinarySearchTreeMain {
public static void main(String[] args) {
BinarySearchTree bst = new BinarySearchTree();
bst.add(10);
bst.add(5);
bst.add(7);
bst.add(29);
bst.add(32);
bst.add(31);
TreePrinter.print(bst.root);
bst.preOrder(bst.root);
System.out.println();
bst.inOrder(bst.root);
System.out.println();
bst.postOrder(bst.root);
bst.remove(31);
}
}
μ€ν κ²°κ³Ό