class BstNode {
constructor(val, left = null, right = null) {
this.val = val
this.left = left
this.right = right
}
print() {
console.log(this.val);
}
}
class BinarySearchTree {
constructor() {
this.root = null
}
insert(val) {
const node = new BstNode(val)
if (!this.root) {
this.root = node
return
}
let cur = this.root
while (true) {
if (val < cur.val) {
if (cur.left === null) {
cur.left = node
break
}
cur = cur.left
} else {
if (cur.right === null) {
cur.right = node
break
}
cur = cur.right
}
}
}
find(val) {
let cur = this.root
while (cur) {
if (val === cur.val) {
return cur
} else if (val < cur.val) {
cur = cur.left
} else if (val > cur.val) {
cur = cur.right
}
}
return null
}
find2(val, node) {
if (!node) {
return null
}
if (val === node.val) {
return node
} else if (val < node.val) {
return this.find2(val, node.left)
} else if (val > node.val) {
return this.find2(val, node.right)
}
}
remove(node, val) {
if (!node) {
return null
}
if (val < node.val) {
node.left = this.remove(node.left, val)
return node
} else if (val > node.val) {
node.right = this.remove(node.right, val)
return node
} else if (val === node.val) {
if (node.left === null && node.right === null) {
return null
} else if (node.right === null) {
return node.left
} else if (node.left === null) {
return node.right
} else if (node.left !== null && node.right !== null) {
let tempNode = this.getMin(node.right)
node.val = tempNode.val
node.right = this.remove(node.right, tempNode.val)
return node
}
}
}
preOrder(node) {
if (node) {
node.print()
this.preOrder(node.left)
this.preOrder(node.right)
}
}
inOrder(node) {
if (node) {
this.inOrder(node.left)
node.print()
this.inOrder(node.right)
}
}
postOrder(node) {
if (node) {
this.postOrder(node.left)
this.postOrder(node.right)
node.print()
}
}
levelOrder() {
if (!this.root) {
return
}
let queue = []
let res = []
queue.push(this.root)
while (queue.length) {
let node = queue.shift()
res.push(node.val)
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
}
return res
}
levelOrder2() {
let queue = []
let res = []
queue.push(this.root)
while (queue.length) {
let len = queue.length
for (let i = 0; i < len; i++) {
let node = queue.shift()
res.push(node.val)
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
}
}
return res
}
getMin(node) {
node = node || this.root
let curr = node
while (curr.left !== null) {
curr = curr.left
}
return curr
}
getMin2(node) {
node = node || this.root
if (node.left === null) {
return node
} else {
return this.getMin2(node.left)
}
}
getMax(node) {
node = node || this.root
let curr = node
while (curr) {
if (curr.right === null) {
return curr
}
curr = curr.right
}
}
getDeep(node, deep) {
deep = deep || 0
if (node === null) {
return deep
}
deep++
let leftDeep = this.getDeep(node.left, deep)
let rightDeep = this.getDeep(node.right, deep)
return Math.max(leftDeep, rightDeep)
}
getDeep2() {
let queue = []
let count = 0
queue.push(this.root)
while (queue.length) {
let len = queue.length
for (let i = 0; i < len; i++) {
let node = queue.shift()
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
}
count++
}
return count
}
}
const tree = new BinarySearchTree()
tree.insert(3)
tree.insert(8)
tree.insert(1)
tree.insert(2)
tree.insert(5)
tree.insert(7)
tree.insert(6)
tree.insert(0)
tree.remove(tree.root, 5)
console.log(tree.find(8))