/**
* @title 二叉排序树
*/
class BinaryTreeNode {constructor(key, value) {
this.key = key;
this.value = value;
this.left = null;
this.right = null;
this.parent = null;
}
}
class BinarySearchTree {constructor() {this.root = null;}
static createNode(key, value) {return new BinaryTreeNode(key, value);
}
insert(node) {
// 如果没有根节点,则直接插入到根节点
if (!this.root) {
this.root = node;
return;
}
let parent = this.root;
while (true) {if (node.key < parent.key) {
// 该节点比父节点小,则该节点在左子树
if (parent.left) {
parent = parent.left;
continue;
} else {
parent.left = node;
break;
}
} else {if (parent.right) {
parent = parent.right;
continue;
} else {
parent.right = node;
break;
}
}
}
node.parent = parent;
}
search(key) {
let currentNode = this.root;
while (currentNode && key !== currentNode.key) {if (key < currentNode.key) {currentNode = currentNode.left;} else {currentNode = currentNode.right;}
}
return currentNode
}
traverse(){return [...this._traverse(this.root)]
}
*_traverse(node){if(!node){return;}
yield* this._traverse(node.left);
yield node;
yield* this._traverse(node.right)
}
}
const tree= new BinarySearchTree();
tree.insert(BinarySearchTree.createNode(10, 10))
tree.insert(BinarySearchTree.createNode(5, 5))
tree.insert(BinarySearchTree.createNode(16, 16))
tree.insert(BinarySearchTree.createNode(7, 7))
tree.insert(BinarySearchTree.createNode(20, 20))
list = [...tree.traverse(tree.root)];