class Node {
constructor(element, parent) {
this.element = element;
this.parent = parent;
this.left = null;
this.right = null;
}
}
class BST {
constructor() {
this.root = null;
this.size = 0;
}
add(element) {
if (this.root == null) {
this.root = new Node(element, null);
this.size++;
return;
}
let currentNode = this.root; // 默认从根节点开始查找
let parent = null;
let compare = null;
while (currentNode) {
compare = element - currentNode.element;
parent = currentNode; // 记住父节点
if (compare > 0) { // 大于当前节点放到右边
currentNode = currentNode.right;
} else if (compare < 0) {
currentNode = currentNode.left;
} else {
currentNode.element = element;
return;
}
}
let newNode = new Node(element, parent);
if (compare > 0) {
parent.right = newNode;
} else {
parent.left = newNode;
}
this.size++;
}
}
let bst = new BST();
let arr = [10,8,19,6,15,22];
arr.forEach(item => {
bst.add(item);
});
console.dir(bst.root);
复杂数据的存储
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(e1,e2){
return e1 - e2;
}
add(element) {
// ....
while (currentNode) {
compare = this.compare(element,currentNode.element);
// ....
}
// ....
this.size++;
}
}
let bst = new BST((e1, e2) => {
return e1.age - e2.age;
});
let arr = [{ age: 10 }, { age: 8 }, { age: 19 }, { age: 6 }, { age: 15 }, { age: 22 }];
arr.forEach(item => {
bst.add(item);
});
console.dir(bst.root);
前序遍历
preorderTraversal() {
const traversal = (node) => {
if (node === null) return
console.log(node.element); // 先访问根节点
traversal(node.left); // 在访问左子树
traversal(node.right);// 在访问右子树
}
traversal(this.root);
}
中。。。
inorderTraversal() {
const traversal = (node) => {
if (node === null) return
traversal(node.left);
console.log(node.element);
traversal(node.right);
}
traversal(this.root);
}
后。。。
postorderTraversal() {
const traversal = (node) => {
if (node === null) return
traversal(node.left);
traversal(node.right);
console.log(node.element);
}
traversal(this.root);
}
层序遍历
levelOrderTraversal() {
if (this.root == null) return;
let stack = [this.root];
let currentNode = null;
let index = 0;
while (currentNode = stack[index++]) {
console.log(currentNode.element);
if (currentNode.left) {
stack.push(currentNode.left);
}
if (currentNode.right) {
stack.push(currentNode.right);
}
}
}