113 lines
1.8 KiB
Java
113 lines
1.8 KiB
Java
|
public class BinarySearchTree {
|
||
|
|
||
|
Node root;
|
||
|
|
||
|
static class Node {
|
||
|
int key;
|
||
|
int value;
|
||
|
Node l;
|
||
|
Node r;
|
||
|
Node p;
|
||
|
|
||
|
public Node(int key, int value, Node p) {
|
||
|
this.key = key;
|
||
|
this.value = value;
|
||
|
this.p = p;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Node search(Node t, int key) {
|
||
|
if (t == null || t.key == key)
|
||
|
return t;
|
||
|
if (key < t.key)
|
||
|
return search(t.l, key);
|
||
|
else
|
||
|
return search(t.r, key);
|
||
|
}
|
||
|
|
||
|
public Node search(int key) {
|
||
|
return search(root, key);
|
||
|
}
|
||
|
|
||
|
Node insert(Node t, Node p, int key, int value) {
|
||
|
if (t == null) {
|
||
|
t = new Node(key, value, p);
|
||
|
} else {
|
||
|
if (key < t.key)
|
||
|
t.l = insert(t.l, t, key, value);
|
||
|
else
|
||
|
t.r = insert(t.r, t, key, value);
|
||
|
}
|
||
|
return t;
|
||
|
}
|
||
|
|
||
|
public void insert(int key, int value) {
|
||
|
root = insert(root, null, key, value);
|
||
|
}
|
||
|
|
||
|
void replace(Node a, Node b) {
|
||
|
if (a.p == null)
|
||
|
root = b;
|
||
|
else if (a == a.p.l)
|
||
|
a.p.l = b;
|
||
|
else
|
||
|
a.p.r = b;
|
||
|
if (b != null)
|
||
|
b.p = a.p;
|
||
|
}
|
||
|
|
||
|
void remove(Node t, int key) {
|
||
|
if (t == null)
|
||
|
return;
|
||
|
if (key < t.key)
|
||
|
remove(t.l, key);
|
||
|
else if (key > t.key)
|
||
|
remove(t.r, key);
|
||
|
else if (t.l != null && t.r != null) {
|
||
|
Node m = t.r;
|
||
|
while (m.l != null)
|
||
|
m = m.l;
|
||
|
t.key = m.key;
|
||
|
t.value = m.value;
|
||
|
replace(m, m.r);
|
||
|
} else if (t.l != null) {
|
||
|
replace(t, t.l);
|
||
|
} else if (t.r != null) {
|
||
|
replace(t, t.r);
|
||
|
} else {
|
||
|
replace(t, null);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void remove(int key) {
|
||
|
remove(root, key);
|
||
|
}
|
||
|
|
||
|
void print(Node t) {
|
||
|
if (t != null) {
|
||
|
print(t.l);
|
||
|
System.out.print(t.key + ":" + t.value + " ");
|
||
|
print(t.r);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void print() {
|
||
|
print(root);
|
||
|
System.out.println();
|
||
|
}
|
||
|
|
||
|
// Usage example
|
||
|
public static void main(String[] args) {
|
||
|
BinarySearchTree tree = new BinarySearchTree();
|
||
|
tree.insert(3, 1);
|
||
|
tree.insert(2, 2);
|
||
|
tree.insert(4, 5);
|
||
|
tree.print();
|
||
|
|
||
|
tree.remove(2);
|
||
|
tree.remove(3);
|
||
|
tree.print();
|
||
|
tree.remove(4);
|
||
|
}
|
||
|
}
|