与AVL树相似,红黑树也是一种平衡的二分查找树,可是对平衡的界说不相同,红黑树每个节点都有色彩值,非红即黑,平衡性也是指黑平衡;咱们结束的这个java初学红黑树是一棵左倾红黑算法的五个特性树,可经过2-3树进行类比;
首先列一下java初学红黑树的5条性质:
- 每个节点要么是红节点,要么是黑节点;
- 根节点一定是黑节点;
- 叶子节点一定是黑节点,此处的叶java面试题子节点指空节点;
- 赤色节点的孩子节点一定是黑色节点;
- 任一节点到叶子节点所经过的黑色节点的个java初学数是相等的;
从第五条数据结构c言语版第二版课后答案性质能够看出红黑树是一棵黑平衡的树;
1、Node节点及红黑树根本特征
为了便利运用红黑树结束映射map,因而泛型设置为K和V,这点与AVL是相同的;java规范库中算法的三种根本结构的TreeMap的底层数据结构与算法结束便是红黑树;
Node节点类包括key、value、左右孩子节点left和right、还有一个co算法导论lor特征用于保护节点的色彩,毕竟坚持黑平衡;咱们在AVL中是用height特征来保护的平衡;
root特征标明红黑树的根节点;size标明红黑树中java初学元素个数;
getSize回来红黑树中元素个数;isEmpty回来红黑树是否为空;
isRed判别节点是否为红节点,红节点回来true,黑节点回来false;
public class RBTree<K extends Comparable<算法K>, V> {
private static final boolean RED = true;
private stati算法c final boolean BLACK = false;
private class Node{
p数据结构c言语版第二版课后答案ublic K key;
public V value;
public Nodejava编译器 left, right;
public boolean coljava面试题or;
public Node(K key, V value){
this.key = key;
this.vjava基础知识点alue = v数据结构教程第5版李春葆答案alue;
left = null;
right = null;
color = RED;
}
}
private Node root;
private int size;
public RBTree(){
root = null;
size = 0;
}
public int get算法工程师Size(){java工作培训班
return size;
}
public boolean isEmpty(){
return size == 0;
}
// 判别节点算法是什么node的色彩
private boolean isRed(Node node){
if(node == null)java模拟器
return BLACK;
rjava言语eturjava面试题n node.color;
}
、、、
}
2、左旋转、右旋转与色彩翻转
左旋转、右旋转和色彩翻转是三个子进程,用于保护在增加元素时坚持红黑树的黑平衡;
// node x
// / 左旋转 /
// T1 x ---------> node T3
// / /
// T2 T3 T1 T2
private Node left算法工程师Rotate(Node node){
Node x = node.right;
// 左旋转java怎样读
node.right = x.left;
x.left = node;
x.color = node.color;
node.color = RED;
return x;
}
// node x
// /算法导论 右旋转 /
// x T2 -算法是什么------> y n算法的时刻复杂度取决于ode
/算法的时刻复杂度取决于/ / /
// y T1 T1 T2
private Node rightRotate(Node node){
Node x = node.left;算法的有穷性是指
// 右旋转
node.left = x.right;
x.right = node;
x.color = node.c数据结构c言语版第二版课后答案olor;
node.color = RED;
return x;
}
// 色彩翻数据结构难学吗转
private void flipColors(Node node){
node.colorjava面试题 = RED;
node.lef算法的五个特性t.color = BLACK;
node.right.数据结构知识点总结color = BLACK;
}
3、向红黑树中增加元素
因为红黑树也是一棵二分查找树,增加java言语元素的前半部分与二分查找树相java初学同,经过递归增加到合适的方位;
增加完元素之后需求经过左旋转、右旋转、色彩翻转三个进程来保护一下黑平衡;
// 向红黑数据结构树中增加新的元素(key, value)
public void add(K key, V value){
ro算法的三种根本结构o算法的三种根本结构t = add(root, key, value);
root.color = BLA算法剖析的意图是CK; // 毕竟根节点为黑色节点
}
// 向以node为根的红黑树中刺进元素(key, value),递java怎样读归算法
// 回来刺进新节点后红黑树的根
private N算法的五个特性ode add(Node no算法工程师de, K key, V value){
if(node == null){
size ++;
return new Node(key算法, value); // 默认刺进赤色节点
}
if(key.compareTo(node.key) < 0)
node.l算法的五个特性eft = add(node.left, key, value);
else if(key.compareTo(node.key) > 0)
node.right = add(node.right, key, value);
else // key.算法的时刻复杂度是指什么compareTo(node.key) == 0
node.value = value;
if (isRed(node.right) && !isRed(node.left))
node = leftRotate(nod数据结构题库及答案e);
if (isRed(node.left) && is数据结构严蔚敏Red(node.left.left))
no数据结构知识点总结de = rightRotate(node);java怎样读
if (isRed(node.left) &a数据结构严蔚敏mp;& isRed(node.right))
flipColors(node);
return node;
}
4、从红黑树中查找和修改元素
查找与修改元素不触及算法剖析的意图是节点色彩的保护,因而不需求特别的进程,因而与数据结构篇05二分查找树的结束根本一同;
// 回来以node为根节点的二分查找树中,key地址的节点
private Node getNodeJava(Node njava初学ode, K key){
if(node == null)
return null;
if(key.equals(node.key))
return nodjava怎样读e;
else if(key.compareTo(node.key) < 0)
return getNode(njava面试题ode.left, key);
else // if(key.compareTo(node.key) > 0)
return getNode(node.right, key);
}
public boolean contains(K key){
return getNode(root, key) != null;
}
public V get(Kjava初学 key){
Node node = getNode(root, k算法的时刻复杂度取决于ey);
return node == null ? nu算法剖析的意图是ll : node.value;
}
public void set(K key, V njava工作培训班ewValue){
Node node = getNode(root, key);
if(node == null)
throw new Illejava怎样读galArgumentException(key + " doesn't exist!");
node.value =算法的五个特性 newValue;
}
5、从红黑树中删去元素
从红黑树中删去元素原理与二java模拟器分查找树是一java面试题起的,javascript可是删去完元素之后需求保护节点的红黑性质,这部分太过于凌乱数据结构,咱们的删去部分并没有结束删去元素后节点的保护;这儿运用的删去办法跟一般的二分查找树相同;
// 回来以node为根的二分查找树的最小值地址的节点
private Node minimum(Node node){数据结构知识点总结
if(node.left == null)
return node;
return minimum(node.left);
}
// 删去掉以node数据结构为根的二分查找树中的最小节点
// 回来删去节点后新的二分查找数据结构严蔚敏第二版课后答案树的根
private N数据结构试验一线性表试验报告ode removeMin(Node node){
if(node.left == null){
Node rightNode = node.r算法设计与剖析ight;
node.right = null;
size -算法设计与剖析-;
return rightNode;
}
node.lefjava模拟器t = removeMin(java言语nod算法的五个特性e.left);
ret数据结构题库及答案urn node;
}
// 从二分查找树中删去键为key的节点
public V remove(K key){
Node node = getNode(数据结构试验一线性表试验报告root, key);
if(node != n算法导论ull){
root = remove(root, key);
return node.value;
}
return nulljava模拟器;
}
private Node remove(Node node, K key){
if( node == null )
return null;
if( key.compareTo(node.key) < 0 ){
node.left = remove(node.lefjava模拟器t , key);
return node;
}
else if(key.compareTo(node.算法的三种根本结构key) > 0 ){
node.right = remove(node.right, key);
retujava言语rn njava初学ode;
}
else{ // key.compareToJava(node.key) =Java= 0
// 待删去节点左子树为空的状况
if(node.left == null){
Node rightNode = nod数据结构c言语版e.right;
node.right = null;
size --;
return rightNode;
}
// 待删去节点右子树为空的状况
if(node.right == null){
Node leftNode = node.left;
node.le数据结构题库及答案ft = nuljava初学l;
size --;
return leftNode;
}
// 待删去节点左右子树均不为空的状况
// 找数据结构难学吗到比待删去节点大的最小节点, 即待删去节点右子树的最小节点
// 用这个节点代替待删去节点的方位
Nojava模拟器de successor = min数据结构教程第5版李春葆答案imum(node.right);
successor.right = removeMin(node.right);
successor.left = node数据结构严蔚敏第二版课后答案.left;
node.left = node.right = null;
return successor;
}
}
6、红黑树悉数代码
public class RBTree<K extends Comparable<K>, V> {
private static fi数据结构c言语版第二版课后答案nal boolean RED = true;
private static final boolean BLACK = false;
priv数据结构与算法ate class Nodejava初学{
public K k数据结构严蔚敏ey;
pujavascriptblic V value;
public Node left, right;
public boolean color;
public Node(K key, V value){
this.key = key;
thjava初学is.value = value算法的时刻复杂度是指什么;
left = null;数据结构
right = null;java面试题
color = RED;
}
}
private Node root;
private int算法 size;
public RBTree(){
root = null;
size = 0;
}
public int getSize(){
return size;
}
public boolean isEmpty(){
r算法导论eturn size == 0;
}
// 判别节点node的色彩
prJavaivate boolean isRed(Node node){
if(node == null)
return BLACK;
return node.coljava言语or;
}
// node x
// / 左旋转 /
// T1 x ---------> node T3
// / /
// T2 T3 T1 T2
privatejava面试题 Node leftRotate(Node node){
Node x = node.right;
// 左旋转
node.right = x.le算法是什么ft;
x.left = node;
x.color = node.color;
nodejava环境变量配置.color = RED;
return x;
}
// node x
// / 右旋转 /
// x T2 -------> y node
// / /
// y T1 T1 T2
private Node rightRotate(Node node){
Node x =算法的时刻复杂度是指什么 node.left;
// 右旋转
node.left = x.right;
x.right算法的三种根本结构 = node;
x.color = node.color;
node.color = RED;
return x数据结构知识点总结;
}
// 色彩翻转
pri算法是什么vate v算法工程师oid flipColors(Node node){
node.color = RED;
node.l数据结构题库及答案eft.color = BLACK;
node.right.color = BLACK;
}
// 向红黑树中增加新的元素(key, value)
public void add(K key, V value){
r算法oot = add(root, key, value);
root.color = BLACK; // 毕竟根节点为黑色节点
}
// 向以node为根数据结构与算法的红黑树中刺进元素(key, value),递归算法
/java言语/ 回来刺进新节点后数据结构红黑树的根
privat数据结构c言语版e Node add(Node node, K key, V value){
if(node == null){
size ++;
return new Node(key, value); // 默认刺进数据结构题库及答案赤色节点
}
if(key.compareTo(数据结构与算法node.key) < 0)
node.leftjava工作培训班 = add(node.left, key, value);
else if(key.compareTo(node.key) > 0)
node.right = add算法(node.right, key, val数据结构严蔚敏ue)算法是什么;
else // key.compareTo(node.key数据结构c言语版第二版课后答案)数据结构与算法 == 0
node.value = value;
if (isRed(node.right) &java基础知识点amp;& !isRed(node.left))
node = leftRotate(node);
if数据结构 (isRed(node.left) && isRed(算法的时刻复杂度取决于node.left.left))
node = rightRotate(node);
if (isRed(node.left) && isRed(node.right))
flipColors(node);
retjava言语urnjava言语 n数据结构严蔚敏ode;
}
// 回来以node为根节点的二分查找树中,key数据结构地址的节点
private Node getNode(Node node, K key){
if(node == null)
return null;
if(key.equals(node.key))
return node;
else if(key.compare算法设计与剖析To(算法是什么node.key) < 0)
return getNode(node.left, key);
else // if(key.compareTo(node.key) > 0)
return getNode(node.right, key);
}
public boolean cjava面试题ontains(K key){
return getNojava初学de(root, key) != null;
}
pub数据结构知识点总结lic V get(K key)数据结构{
Node node = getNode(root, key);
return node == null ? null : node.val算法工程师ue;
}
public void set(K key, V newValue){
Njava面试题ode node = getNode算法的五个特性(root, kejavascripty);
if(node == null)
throw new IllegalArgumentException(key + " doesn't exist!");
node.value = newValue;
}
// 回来以node为根的二java怎样读分查找树的最小值地址的节点
p算法剖析的意图是rivat算法的有穷性是指e Node minimumjava编译器(Node node){
if(nojava编译器de.left == null)
return node;
return minimum(node.left);
}
// 删去掉以node为根的二分查找树中的最小节点
// 回来删去节点后新的二分查找树的根
private Node removeMin(No算法是什么de node){
if(node.left == null){
Node rightNode = node.right数据结构教程第5版李春葆答案;
node.right = null;
size --;
return rig数据结构题库及答案htNode;
}
node.left = removeMin(node.left);
return node;
}java初学
// 从二分查找树中删去键为key的节点
public V remove(K key){
Node node = getNode(root, key);
if(node != null){
root = remove(root, key);
return node.value;
}java面试题
return null;
}
private Node remove(Node node, Kjava基础知识点 key){
if( node == null )
r数据结构c言语版eturn null;
if( key.compareTo(node.key) < 0 ){
node.left = remove(node.left , key);
return node;
}
else if(key.compareTo(node.key)算法 > 0 ){
n数据结构ode.right = remove(node.right, key);
return node;
}
else{ // key.compareTo(nodjava面试题e.key) == 0
// 待删去节点左子树为空的状况
if(node.left == null){
Node rightNode = node.right;
node.right =Java null;
size --;
return rightNode;
}
// 待删去节点右子树为数据结构题库及答案空的状况
if(no数据结构与算法de.right ==算法的五个特性 null){
Node leftNode = node.left;
node.left = null;
size --;
return leftNode;
}
/数据结构与算法/ 待删去节点左右子树均不为空的状况
// 找到比待删去节点大的最小节点, 即待删去节点右子树的最小节点
// 用这个节点代替待删去节点的方位
Node successor = minimum算法的时刻复杂度取决于(node.right);
sujava初学ccessor.right = removeMin(node.right);
successor.left = node.left;
node.left = node.right = null;
return successor数据结构难学吗;
}
}
}