三行代码搞定JavaScript二叉树前中后序遍历
class Node {
parent = null
value = null
left = null
right = null
constructor(value) {
this.value = value
}
}
class Tree {
static of() {
return new Tree(...arguments)
}
root = null
constructor(arr) {
let nodes = arr.map(v => {
return v == null ? null : new Node(v)
});
let tempNodes = []
this.root = nodes[0] != null ? nodes[0] : null
if (!(this.root)) {
return {}
}
tempNodes.push(nodes.shift())
while (nodes.length) {
let [leftNode, rightNode] = [nodes.shift(), nodes.shift()]
let tempNode = tempNodes.shift()
if (leftNode != null) {
tempNodes.push(leftNode)
tempNode.left = leftNode
leftNode.parent = tempNode
}
if (rightNode != null) {
tempNodes.push(rightNode)
tempNode.right = rightNode
rightNode.parent = tempNode
}
}
this.arr = arr
}
bianli(type) {
return this[type].call(this, this.root)
}
qianxv(root) {
if (root == null) {
return []
}
return [root.value, ...this.qianxv(root.left), ...this.qianxv(root.right)]
}
zhongxv(root) {
if (root == null) {
return []
}
return [...this.zhongxv(root.left), root.value, ...this.zhongxv(root.right)]
}
houxv(root) {
if (root == null) {
return []
}
return [...this.houxv(root.left), ...this.houxv(root.right), root.value]
}
}
let arr = [1, 2, 3, 4, 5, null, 6, null, null, 7, 8]
let tree = Tree.of(arr)
let testarr = tree.bianli('qianxv')
let testarr1 = tree.bianli('zhongxv')
let testarr2 = tree.bianli('houxv')