红黑树五大性质
①结点是红色或者黑色,结点上只有一个color属性
②根节点是黑色
③叶子结点都是黑色,且为null
④连接红色结点的两个子结点都是黑色,红色结点的父结点都是黑色,红色子结点都是黑色
⑤从任意结点出发,到其每个叶子结点的路径中包含相同数据的黑色结点
五条性质是为了保证:从根结点到叶子结点的最长路径不大于最短路径的两倍
由于性质4,红黑树中不会出现两个红色结点相邻的情形。树中最短的可能出现的路径是都是黑色结点的路径,树中最长的可能出现的路径是红色结点和黑色结点交替的路径。再结合性质5,每条路径上均包含相同数目的黑色结点,所以红黑树确保没有一条路径会比其他路径长出2倍。
// 结点
function Node(value) {
this.value = value
this.color = 'red' // 结点的颜色默认为红色
this.parent = null
this.left = null
this.right = null
}
function RedBlackTree() {
this.root = null
}
RedBlackTree.prototype.insert = function(node) {
// 以二叉搜索树的方式插入结点
// 如果根结点不存在,则结点作为根结点
// 如果结点的值小于node,且结点的右子结点不存在,跳出循环
// 如果结点的值大于等于node,且结点的左子结点不存在,跳出循环
if (!this.root) {
this.root = node
} else {
let current = this.root
while (current[node.value <= current.