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
} else {
let currentNode = this.root
let compare = 0
let parent = null
while (currentNode) {
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
visitor.visit(node.element)
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)
visitor.visit(node.element)
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)
visitor.visit(node.element)
}
traversal(this.root)
}
leveTraversal(visitor) {
const traversal = (node) => {
if (node === null) return
let tree = []
tree.push(node)
while (tree.length) {
const node = tree.shift()
visitor.visit(node.element)
if (node.left) {
tree.push(node.left)
}
if (node.right) {
tree.push(node.right)
}
}
}
traversal(this.root)
}
inverTree(){
if(this.root == null) return
let stack = [this.root]
let index = 0
let currentNode = null
while(currentNode = stack[index++]){
let tmp = currentNode.left
currentNode.left= currentNode.right
currentNode.right = tmp
if(currentNode.left){
stack.push(currentNode.left)
}
if(currentNode.right){
stack.push(currentNode.right)
}
}
}
}
let bst = new BST()