Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之紅黑樹
概述
從今天開始, 小白我將帶大家開啟 Java 數(shù)據(jù)結(jié)構(gòu) & 算法的新篇章.

紅黑樹
紅黑樹 (Red Black Tree) 是一種自平衡二叉查找樹. 如圖:

紅黑樹的特征:
- 研究紅黑樹的每個節(jié)點都是由顏色的, 非黑即紅
- 根節(jié)點為黑色
- 每個葉子節(jié)點都是黑色的
- 如果一個子節(jié)點是紅色的, 那么它的孩子節(jié)點都是黑色的
- 從任何一個節(jié)點到葉子節(jié)點, 經(jīng)過的黑色節(jié)點是一樣的
紅黑樹的實現(xiàn)
Node 類
// Node類
private class Node {
public E e;
public Node left;
public Node right;
public boolean color;
// Node構(gòu)造
public Node(E e) {
this.e = e;
this.left = null;
this.right = null;
color = RED;
}
@Override
public String toString() {
return "It is node value is: " + e;
}
}
添加元素
// 添加元素
public Node addElement(Node node, E e) {
if(node == null) {
size++;
return new Node(e);
}
// 判斷元素大小
if(e.compareTo(node.e) < 0) {
// 左添加
node.left = addElement(node.left, e);
} else {
// 右添加
node.right = addElement(node.right, e);
}
// 左旋
if(isRed(node.right) && !isRed(node.left)) {
node = leftRotate(node);
}
// 右旋
if(isRed(node.left) && !isRed(node.left.left)) {
node = rightRotate(node);
}
// 顏色反轉(zhuǎn)
if(isRed(node.right) && !isRed(node.left)) {
flipColors(node);
}
return node;
}
左旋
左旋指的是, 以某個節(jié)點作為支撐點, 其右子節(jié)點變?yōu)樾D(zhuǎn)節(jié)點的父節(jié)點, 右子節(jié)點的左子節(jié)點的左字節(jié)點變?yōu)樾D(zhuǎn)節(jié)點的右子節(jié)點, 旋轉(zhuǎn)節(jié)點的左子節(jié)點保持不變. 如圖:

// node x
// / \ 左旋轉(zhuǎn) / \
// T1 x ==> node T3
// / \ / \
// T2 T3 T1 T2
private Node leftRotate(Node node) {
Node x = node.right;
// 左旋轉(zhuǎn)
node.right = x.left;
x.left = node;
x.color = node.color;
node.color = RED;
return x;
}
右旋
右旋與左旋相反.
代碼實現(xiàn):
// node x
// / \ 右旋轉(zhuǎn) / \
// x T2 ==> y node
// / \ / \
// y T1 T1 T2
private Node rightRotate(Node node) {
Node x = node.left;
// 右旋轉(zhuǎn)
node.left = x.right;
x.right = node;
x.color = node.color;
node.color = RED;
return x;
}
完整代碼
public class RBT<E extends Comparable<E>> {
private static final boolean RED = true;
private static final boolean BLACK = true;
// Node類
private class Node {
public E e;
public Node left;
public Node right;
public boolean color;
// Node構(gòu)造
public Node(E e) {
this.e = e;
this.left = null;
this.right = null;
color = RED;
}
@Override
public String toString() {
return "It is node value is: " + e;
}
}
public Node root;
private int size;
public int size() {
return size;
}
// 添加元素
public Node addElement(Node node, E e) {
if(node == null) {
size++;
return new Node(e);
}
// 判斷元素大小
if(e.compareTo(node.e) < 0) {
// 左添加
node.left = addElement(node.left, e);
} else {
// 右添加
node.right = addElement(node.right, e);
}
// 左旋
if(isRed(node.right) && !isRed(node.left)) {
node = leftRotate(node);
}
// 右旋
if(isRed(node.left) && !isRed(node.left.left)) {
node = rightRotate(node);
}
// 顏色反轉(zhuǎn)
if(isRed(node.right) && !isRed(node.left)) {
flipColors(node);
}
return node;
}
// node x
// / \ 左旋轉(zhuǎn) / \
// T1 x ==> node T3
// / \ / \
// T2 T3 T1 T2
private Node leftRotate(Node node) {
Node x = node.right;
// 左旋轉(zhuǎn)
node.right = x.left;
x.left = node;
x.color = node.color;
node.color = RED;
return x;
}
// node x
// / \ 右旋轉(zhuǎn) / \
// x T2 ==> y node
// / \ / \
// y T1 T1 T2
private Node rightRotate(Node node) {
Node x = node.left;
// 右旋轉(zhuǎn)
node.left = x.right;
x.right = node;
x.color = node.color;
node.color = RED;
return x;
}
// 顏色反轉(zhuǎn)
private void flipColors(Node node) {
node.color = RED;
node.left.color = BLACK;
node.right.color = BLACK;
}
// 判斷是否為紅色
private boolean isRed(Node node) {
if(node==null) return BLACK;
return node.color;
}
}
到此這篇關(guān)于Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之紅黑樹的文章就介紹到這了,更多相關(guān)Java 紅黑樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot同一個方法操作多個數(shù)據(jù)源保證事務(wù)一致性
本文探討了在Spring Boot應(yīng)用中,如何在同一個方法中操作多個數(shù)據(jù)源并保證事務(wù)的一致性,由于聲明式事務(wù)的限制,直接使用@Transactional注解無法滿足需求,文章介紹了解決方案:編程式事務(wù),它允許在代碼級別更靈活地管理事務(wù),確保多數(shù)據(jù)源操作的事務(wù)一致性2024-11-11
Java8中List轉(zhuǎn)換String字符串幾種方式
這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)換String字符串的幾種方式,在實際開發(fā)中經(jīng)常遇到List轉(zhuǎn)為String字符串的情況,文中給出了幾種方法的示例代碼,需要的朋友可以參考下2023-07-07
spring security實現(xiàn)下次自動登錄功能過程解析
這篇文章主要介紹了spring security實現(xiàn)記住我下次自動登錄功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
解決Feign配置RequestContextHolder.getRequestAttributes()為null的問題
這篇文章主要介紹了解決Feign配置RequestContextHolder.getRequestAttributes()為null的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
java.lang.NumberFormatException異常解決方案詳解
這篇文章主要介紹了java.lang.NumberFormatException異常解決方案詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
淺談SpringBoot項目如何讓前端開發(fā)提高效率(小技巧)
這篇文章主要介紹了淺談SpringBoot項目如何讓前端開發(fā)提高效率(小技巧),主要介紹了Swagger和Nginx提高效率的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04

