class BinarySearchTree extends BinaryTree {
constructor (...args) {
super(...args);
}
find (key) {
if (!this.node) return this;
else if (this.node.entry.key < key) return this.node.right.find(key);
else if (this.node.entry.key > key) return this.node.left.find(key);
else return this;
}
insert (entry) {
let t = this.find (entry.key);
if (t.node) throw `This key already in tree: ${entry.key}`;
t.node = new BinaryTreeNode (entry, new BinarySearchTree(),
new BinarySearchTree())
return t
}
leftmost () {
if (!this.node.left.node) return this;
return this.node.left.leftmost();
}
delete(key = this.node.entry.key) {
let t = this.find (key);
if (!t.node) throw `This key does not exist in the tree: ${key}`;
if (!t.node.left.node && !t.node.right.node) {
t.node = null;
}
else if (!t.node.left.node) {
t.node = t.node.right.node
}
else if (!t.node.right.node) {
t.node = t.node.left.node
}
else {
let l = t.node.right.leftmost();
t.node.entry = l.node.entry;
l.delete()
}
}
clone() {
if (!this.node) return new BinarySearchTree();
return new BinarySearchTree (new BinaryTreeNode (this.node.entry,
this.node.left.clone(),
this.node.right.clone()))
}
}