1.实现二叉搜索树
class Node {
constructor(element, parent) {
this.element = element;
this.parent = parent;
this.left = null;
this.right = null;
}
}
// 二叉搜索树
class BST {
constructor(compare) {
this.root = null;
this.size = 0;
this.compare = compare || this.compare
}
compare(el, e2) {
return e1 - e2;
}
add(element) {
if (this.root == null) {
this.root = new Node(element, null);
this.size++;
return
} else {
let currentNode = this.root;
let compare = 0;
let parent = null;
while (currentNode) {
// compare = element - currentNode.element;
compare = this.compare(element, currentNode.element)
parent = currentNode;
if (compare > 0) {
currentNode = currentNode.right
} else {
currentNode = currentNode.left
}
}
let newNode = new Node(element, parent)
if (compare > 0) {
parent.right = newNode
} else {
parent.left = newNode
}
}
}
// 先(前)序遍历(深度优先)
preorderTraversal(visitor) {
if (visitor == null) return;
const traversal = (node) => {
if (node == null) return;
// console.log(node.element)
visitor.visit(node)
traversal(node.left)
traversal(node.right)
}
traversal(this.root)
}
// 中序遍历
inorderTraversal(visitor) {
if (visitor == null) return;
const traversal = (node) => {
if (node == null) return;
traversal(node.left)
// console.log(node.element)
visitor.visit(node)
traversal(node.right)
}
traversal(this.root)
}
// 后序遍历
postorderTraversal(visitor) {
if (visitor == null) return;
const traversal = (node) => {
if (node == null) return;
traversal(node.left)
traversal(node.right)
// console.log(node.element)
visitor.visit(node)
}
traversal(this.root)
}
}
const bst = new BST((e1, e2) => {
return e1.age - e2.age
})
// const arr = [10, 8, 19, 6, 15, 22, 20]
const arr = [
{ name: 'zs', age: 10 },
{ name: 'zss', age: 11 },
{ name: 'xzs', age: 13 },
{ name: 'xzsx', age: 15 },
{ name: 'lisi', age: 10 },
]
arr.forEach(element => {
bst.add(element)
})
console.dir(bst, { depth: 200 })
bst.postorderTraversal({
visit(node) {
console.log(node.element)
}
})