2020-10-12 15:56:01 +08:00
|
|
|
/*
|
|
|
|
|
Breadth First Tree Traversal or level order traversal implementation in javascript
|
|
|
|
|
Author: @GerardUbuntu
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
class Node {
|
|
|
|
|
constructor (data) {
|
|
|
|
|
this.data = data
|
|
|
|
|
this.left = null
|
|
|
|
|
this.right = null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class BinaryTree {
|
|
|
|
|
constructor () {
|
|
|
|
|
this.root = null
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-22 04:54:29 -07:00
|
|
|
breadthFirstIterative () {
|
2022-09-25 01:11:00 -07:00
|
|
|
const traversal = []
|
2022-09-22 04:54:29 -07:00
|
|
|
if (this.root) {
|
2022-09-25 01:11:00 -07:00
|
|
|
traversal.push(this.root)
|
2022-09-22 04:54:29 -07:00
|
|
|
}
|
2022-09-25 01:11:00 -07:00
|
|
|
for (let i = 0; i < traversal.length; i++) {
|
|
|
|
|
const currentNode = traversal[i]
|
2022-09-22 04:54:29 -07:00
|
|
|
if (currentNode.left) {
|
2022-09-25 01:11:00 -07:00
|
|
|
traversal.push(currentNode.left)
|
2022-09-22 04:54:29 -07:00
|
|
|
}
|
|
|
|
|
if (currentNode.right) {
|
2022-09-25 01:11:00 -07:00
|
|
|
traversal.push(currentNode.right)
|
2022-09-22 04:54:29 -07:00
|
|
|
}
|
2022-09-25 01:11:00 -07:00
|
|
|
traversal[i] = currentNode.data
|
2022-09-22 04:54:29 -07:00
|
|
|
}
|
2022-09-25 01:11:00 -07:00
|
|
|
return traversal
|
2022-09-22 04:54:29 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
breadthFirstRecursive () {
|
2022-09-25 01:11:00 -07:00
|
|
|
const traversal = []
|
2020-10-12 15:56:01 +08:00
|
|
|
const h = this.getHeight(this.root)
|
2022-01-24 17:43:48 +08:00
|
|
|
for (let i = 0; i !== h; i++) {
|
2022-09-25 01:11:00 -07:00
|
|
|
this.traverseLevel(this.root, i, traversal)
|
2020-10-12 15:56:01 +08:00
|
|
|
}
|
2022-09-25 01:11:00 -07:00
|
|
|
return traversal
|
2020-10-12 15:56:01 +08:00
|
|
|
}
|
|
|
|
|
|
2021-10-05 12:49:23 +05:30
|
|
|
// Computing the height of the tree
|
2020-10-12 15:56:01 +08:00
|
|
|
getHeight (node) {
|
2022-01-24 17:43:48 +08:00
|
|
|
if (node === null) {
|
2020-10-12 15:56:01 +08:00
|
|
|
return 0
|
|
|
|
|
}
|
2022-01-24 17:43:48 +08:00
|
|
|
const lheight = this.getHeight(node.left)
|
|
|
|
|
const rheight = this.getHeight(node.right)
|
|
|
|
|
return lheight > rheight ? lheight + 1 : rheight + 1
|
2020-10-12 15:56:01 +08:00
|
|
|
}
|
|
|
|
|
|
2022-09-25 01:11:00 -07:00
|
|
|
traverseLevel (node, levelRemaining, traversal) {
|
2022-01-24 17:43:48 +08:00
|
|
|
if (node === null) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if (levelRemaining === 0) {
|
2022-09-25 01:11:00 -07:00
|
|
|
traversal.push(node.data)
|
2020-10-12 15:56:01 +08:00
|
|
|
} else {
|
2022-09-25 01:11:00 -07:00
|
|
|
this.traverseLevel(node.left, levelRemaining - 1, traversal)
|
|
|
|
|
this.traverseLevel(node.right, levelRemaining - 1, traversal)
|
2020-10-12 15:56:01 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-11 14:48:06 +02:00
|
|
|
export { BinaryTree, Node }
|