Javascript常见数据结构五——树
八、树
1.二叉树
二叉树在计算机科学中应用非常广泛,它是一种特殊的树,每个节点最多拥有两个子节点,利用他的特性我们可以更高效的对树中数据进行增 删 查等操作。
二叉查找树
二叉查找树又名二叉排序树,亦称是二叉搜索树,是二叉树的一种,每个节点最多有两个子树的树结构。通常子树被称作 左子树 和 右子树
特点:
1.左子树不为空,则左子树上的所有节点的值均小于根节点的值
2.右子树不为空,则右子树上的所有结点的值均大于根节点的值
3.左、右子树也分别为二叉排序树;
4.没有键值相等的节点。
let BST = (function () {
//存值的具体内容
const Node = class {
constructor(data) {
this.data = data
this.left = null
this.right = null
}
}
// 递归插值
function insertData(root, node) {
let dir = node.data < root.data ? "left" : "right"
if (root[dir]) {
insertData(root[dir], node)
} else {
root[dir] = node
}
}
const root = Symbol()
return class {
constructor() {
// 存根节点
this[root] = null
}
// 插入
insert(data) {
// 创建节点
let node = new Node(data)
// 根存不存在
if (this[root]) {
// 根节点存在
insertData(this[root], node)
} else {
this[root] = node
}
}
}
})()
中序遍历:因为二叉搜索树的左子树一定大于根节点,根节点一定小于右子树的规律,进行递归
let BST = (function () {
//存值的具体内容
const Node = class {
constructor(data) {
this.data = data
this.left = null
this.right = null
}
}
// 递归插值
function insertData(root, node) {
let dir = node.data < root.data ? "left" : "right"
if (root[dir]) {
insertData(root[dir], node)
} else {
root[dir] = node
}
}
// 中序遍历
function inOrderTraverseNode(root, arr) {
// root 不存在
if (!root) return
inOrderTraverseNode(root.left,arr)
arr.push(root.data)
inOrderTraverseNode(root.right,arr)
}
const root = Symbol()
return class {
constructor() {
// 存根节点
this[root] = null
}
// 插入
insert(data) {
// 创建节点
let node = new Node(data)
// 根存不存在
if (this[root]) {
// 根节点存在
insertData(this[root], node)
} else {
this[root] = node
}
}
// 中序遍历
inOrderTraverseNode() {
let arr = []
inOrderTraverseNode(this[root], arr)
return arr
}
}
})()
二叉平衡树
特点:
1.二叉树左右两个子树的高度差不超过1
2.任意节点的两个子树都是一颗平衡二叉树