红黑树在JDK中应用很广泛,像HashMap、TreeMap等使用树结构的地方几乎都用了红黑树。这篇文章将透彻的分析红黑树原理。
我写这篇文章还有一个理由,就是国内的关于红黑树的文章太水了,互相抄,一点都不通,我看了半天看不懂!千万不要说程序员会用就行了,有的时候还真需要一股钻研的劲头才能成为一名优秀的人。这篇前半部分是汇总过来的,红黑树删除部分是翻译的一篇英文的,我不敢保证人人都能看懂我写的,不过我感觉我自己是懂的.....如果不懂评论区问我吧。
红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。
BST
二叉查找树(Binary Search Tree,简称BST)或二叉搜索树,是一棵二叉树,它的左子节点的值比父节点的值要小,右节点的值要比父节点的值大。它的高度决定了它的查找效率。
在理想的情况下,二叉查找树增删查改的时间复杂度为O(logN)(其中N为节点数),最坏的情况下为O(N)。当左右高度差值小于等于1,我们就说二叉查找树是平衡的。需要注意二叉查找树不需要是满树。
查找:
T key = a search key
Node root = point to the root of a BST
while(true){
if(root==null){
break;
}
if(root.value.equals(key)){
return root;
}
else if(key.compareTo(root.value)<0){
root = root.left;
}
else{
root = root.right;
}
}
return null;
当BST查找的时候,先与当前节点进行比较:
- 如果相等的话就返回当前节点;
- 如果少于当前节点则继续查找当前节点的左节点;
- 如果大于当前节点则继续查找当前节点的右节点。
直到当前节点指针为空或者查找到对应的节点,程序查找结束。
插入:
Node node = create a new node with specify value
Node root = point the root node of a BST
Node parent = null;
//find the parent node to append the new node
while(true){
if(root==null)break;
parent = root;
if(node.value.compareTo(root.value)<=0){
root = root.left;
}else{
root = root.right;
}
}
if(parent!=null){
if(node.value.compareTo(parent.value)<=0){//append to left
parent.