数据结构
二叉树
满二叉树
一个二叉树,每一层的结点数都达到了最大值。
完全二叉树
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树
二叉查找树
左结点小于根结点,右结点大于根结点。子树也如此。
平衡二叉树
左右子树的高度差不能大于1。子树也如此。
通过旋转结点来保持二叉树的平衡。
二叉树的创建
class Node {
constructor(data, left, right) {
Object.assign(this, {
data,
left,
right
})
}
}
class BST {
constructor() {
this.root = null
}
insert(data) {
let node = new Node(data)
if (!this.root) {
this.root = node
}
else {
let current = this.root
while (true) {
if (data < current.data) {
if (current.left) {
current = current.left
}
else {
current.left = node
break
}
}
else {
if (current.right) {
current = current.right
}
else {
current.right = node
break
}
}
}
}
}
}
// 使用
let tree = new BST()
tree.insert(10)
tree.insert(20)
tree.insert(15)
tree.insert(12)
tree.insert(5)
树的遍历
二叉树的递归遍历
// 递归的先序遍历
function preOrder (node, cb) {
if (node) {
cb(node.data)
preOrder(node.left, cb)
preOrder(node.right, cb)
}
}
// 递归的中序遍历
function inOrder (node, cb) {
if (node) {
inOrder(node.left, cb)
cb(node.data)
inOrder(node.right, cb)
}
}
// 递归的后序遍历
function postOrder (node, cb) {
if (node) {
postOrder(node.left, cb)
postOrder(node.right, cb)
cb(node.data)
}
}