class Node {
int key;
Node left;
Node right;
public Node(int key) {
this.key = key;
}
}
public class TestDemo3 {
private Node root = null;
public Node search(int key) {
Node cur = root;
while (cur != null) {
if (key == cur.key) {
return cur;
} else if (key > cur.key) {
cur = cur.right;
} else {
cur = cur.left;
}
}
return null;
}
public boolean insert(int key) {
if (root == null) {
root = new Node(key);
return true;
}
Node cur = root;
Node parent = null;
while (cur != null) {
if (key == cur.key) {
return false;
} else if (key > cur.key) {
parent = cur;
cur = cur.right;
} else {
parent = cur;
cur = cur.left;
}
}
Node node = new Node(key);
if (key < parent.key) {
parent.left = node;
} else {
parent.right = node;
}
return true;
}
public void remove(int key) {
if (root == null) return;
Node cur = root;
Node parent = null;
while (cur != null) {
if (cur.key == key) {
removeNode(parent,cur,key);
} else if (cur.key < key) {
parent = cur;
cur = cur.right;
} else {
parent = cur;
cur = cur.left;
}
}
}
public void removeNode(Node parent,Node cur,int key) {
if (cur.left == null) {
if (cur == root) {
root = cur.right;
} else if (cur == parent.left) {
parent.left = cur.right;
} else {
parent.right = cur.right;
}
} else if (cur.right == null) {
if (cur == root) {
root = cur.left;
} else if (cur == parent.left) {
parent.left = cur.left;
} else {
parent.right = cur.left;
}
} else {
Node targetParent = cur;
Node target = cur.right;
while (target.left != null) {
targetParent = target;
target = targetParent.left;
}
cur.key = target.key;
if (target == targetParent.left) {
targetParent.left = target.right;
} else {
targetParent.right = target.right;
}
}
}
}