어떤 Node가 특정 값 value를 가질 때,
해당 Node의 왼쪽 서브 트리는 value보다 작은 값들로만 이루어져 있고,
해당 Node의 오른쪽 서브 트리는 value보다 큰 값들로만 이루어져 있는 Binary Tree를 뜻합니다.
이 때, 중복값은 허용되지 않습니다.
class Node {
public int value;
public Node left;
public Node right;
Node(int value) {
this.value = value;
}
}
public class BST {
private Node root;
BST(int value) {
Node newNode = new Node(value);
root = newNode;
}
}
public boolean insert(int value) {
Node newNode = new Node(value);
if (root == null) {
root = newNode;
return true;
}
Node temp = root;
while (true) {
if (newNode.value == temp.value) {
return false;
}
if (newNode.value < temp.value) {
if (temp.left == null) {
temp.left = newNode;
return true;
}
temp = temp.left;
} else {
if (temp.right == null) {
temp.right = newNode;
return true;
}
temp = temp.right;
}
}
}
public boolean search(int value) {
if (root == null) {
return false;
}
Node temp = root;
while (temp != null) {
if (value == temp.value) {
return true;
}
if (value < temp.value) {
temp = temp.left;
} else {
temp = temp.right;
}
}
return false;
}
public Node remove(Node root, int value) {
if (root == null) {
return root;
}
if (value < root.value) {
root.left = remove(root.left, value);
} else if (value > root.value) {
root.right = remove(root.right, value);
} else {
if (root.left == null) {
return root.right;
} else if (root.right == null) {
return root.left;
} else {
root.value = findMinNode(root.right).value;
root.right = remove(root.right, root.value);
}
}
return root;
}
Node findMinNode(Node node) {
while (node != null) {
node = node.left;
}
return node;
}
경우 | 최악 | 평균 |
---|---|---|
숫자 insert하기 | O(N) | O(logN) |
숫자가 있는지 확인하기 | O(N) | O(logN) |
숫자 remove하기 | O(N) | O(logN) |