use std::cmp::Ordering;
use super::ST;
pub mod trace;
#[derive(Default)]
pub struct RedBlackBST<K: PartialOrd, V> {
root: Link<K, V>,
}
enum Color {
Red,
Black,
}
impl Color {
fn flip(&self) -> Self {
match self {
Color::Red => Color::Black,
Color::Black => Color::Red,
}
}
}
impl Clone for Color {
fn clone(&self) -> Self {
match self {
Self::Red => Self::Red,
Self::Black => Self::Black,
}
}
}
struct Node<K, V> {
key: K,
val: V,
left: Link<K, V>,
right: Link<K, V>,
n: usize,
color: Color,
}
impl<K, V> Node<K, V> {
fn update_n(&mut self) {
let mut n = 1;
if self.left.is_some() {
n += self.left.as_deref().unwrap().n;
}
if self.right.is_some() {
n += self.right.as_deref().unwrap().n;
}
self.n = n;
}
fn new(key: K, val: V, n: usize, color: Color) -> Box<Self> {
Box::new(Node {
key,
val,
left: None,
right: None,
n,
color,
})
}
fn is_left_red(&self) -> bool {
self.left
.as_deref()
.map_or_else(|| false, |left| left.is_red())
}
fn is_left_red_of_right(&self) -> bool {
self.right.as_deref().map_or(false, |f| f.is_left_red())
}
fn is_right_red(&self) -> bool {
self.right
.as_deref()
.map_or_else(|| false, |node| node.is_red())
}
fn is_red(&self) -> bool {
match self.color {
Color::Red => true,
Color::Black => false,
}
}
fn rotate_left(mut self) -> Box<Node<K, V>> {
let mut x = self.right.take().unwrap();
self.right = x.left.take();
x.left = Some(Box::new(self));
let left = x.left.as_deref_mut().unwrap();
x.color = left.color.clone();
left.color = Color::Red;
x.n = left.n;
left.update_n();
x
}
fn rotate_right(mut self) -> Box<Self> {
if self.left.is_none() {
return Box::new(self);
}
let mut x = self.left.take().unwrap();
self.left = x.right.take();
x.right = Some(Box::new(self));
let right = x.right.as_deref_mut().unwrap();
x.color = right.color.clone();
right.color = Color::Red;
x.n = right.n;
right.update_n();
x
}
fn flip_colors(&mut self) {
self.color = self.color.flip();
let left = self
.left
.as_deref_mut()
.expect("翻转颜色的前提是子节点非none,left不符合");
left.color = left.color.flip();
let right = self
.right
.as_deref_mut()
.expect("翻转颜色的前提是子节点非none,right不符合");
right.color = right.color.flip();
}
fn need_rotate_left(&self) -> bool {
self.is_right_red() && !self.is_left_red()
}
fn need_rotate_right(&self) -> bool {
self.is_left_red() && self.left.as_deref().map_or(false, |f| f.is_left_red())
}
fn need_flip_colors(&self) -> bool {
self.is_left_red() && self.is_right_red()
}
fn move_red_left(mut self: Box<Self>) -> Box<Self> {
self.flip_colors();
if self.is_left_red_of_right() {
self.right = Some(self.right.unwrap().rotate_right());
self = self.rotate_left();
self.flip_colors();
}
self
}
fn move_red_right(mut self: Box<Self>) -> Box<Self> {
self.flip_colors();
if self.left.as_deref().map_or(false, |f| f.is_left_red()) {
self = self.rotate_right();
self.flip_colors();
}
self
}
}
type Link<K, V> = Option<Box<Node<K, V>>>;
struct Temp<K, V> {
node: Link<K, V>,
target: Box<Node<K, V>>,
}
impl<K: PartialOrd, V> RedBlackBST<K, V> {
pub fn new() -> Self {
RedBlackBST { root: None }
}
fn size_for(node: &Link<K, V>) -> usize {
match node {
Some(t) => t.n,
None => 0,
}
}
pub fn is_balanced(&self) -> bool {
let mut black = 0;
let mut x = self.root.as_deref();
while let Some(t) = x {
if !t.is_red() {
black += 1;
}
x = t.left.as_deref();
}
Self::is_balanced_inner(&self.root, black)
}
fn is_balanced_inner(node: &Link<K, V>, mut black: usize) -> bool {
if let Some(x) = node {
if !x.is_red() {
if black == 0 {
return false;
}
black -= 1;
}
Self::is_balanced_inner(&x.left, black) && Self::is_balanced_inner(&x.right, black)
} else {
black == 0
}
}
fn get_from<'a>(node: &'a Link<K, V>, key: &K) -> Option<&'a V> {
match node {
Some(t) => match key.partial_cmp(&t.key).unwrap() {
Ordering::Less => Self::get_from(&t.left, key),
Ordering::Equal => Some(&t.val),
Ordering::Greater => Self::get_from(&t.right, key),
},
None => None,
}
}
fn put_for(node: Link<K, V>, key: K, val: V) -> Link<K, V> {
let mut target = match node {
Some(mut t) => match &key.partial_cmp(&t.key).unwrap() {
Ordering::Less => {
t.as_mut().left = RedBlackBST::put_for(t.left.take(), key, val);
t.update_n();
Some(t)
}
Ordering::Equal => {
t.as_mut().val = val;
Some(t)
}
Ordering::Greater => {
t.as_mut().right = RedBlackBST::put_for(t.right.take(), key, val);
t.update_n();
Some(t)
}
},
None => Some(Node::new(key, val, 1, Color::Red)),
};
if target.is_some() {
let node = target.as_deref().unwrap();
if node.need_rotate_left() {
target = Some(target.unwrap().rotate_left());
}
let node = target.as_deref().unwrap();
if node.need_rotate_right() {
target = Some(target.unwrap().rotate_right());
}
let node = target.as_deref().unwrap();
if node.need_flip_colors() {
target.as_deref_mut().unwrap().flip_colors();
}
target.as_deref_mut().unwrap().update_n();
}
target
}
fn min_for(node: &Link<K, V>) -> Option<&K> {
node.as_deref().and_then(|t| {
if t.left.is_some() {
RedBlackBST::min_for(&t.left)
} else {
Some(&t.key)
}
})
}
fn balance_delete_min(node: Link<K, V>) -> Temp<K, V> {
let mut h = node.expect("balance delete min have to has none node");
let left = &h.as_ref().left;
if left.is_none() {
return Temp {
node: None,
target: h,
};
}
if !(h.is_left_red()) && !(h.left.as_deref().map_or(false, |f| f.is_left_red())) {
h = h.move_red_left();
}
let Temp { node, target } = RedBlackBST::balance_delete_min(h.left.take());
h.left = node;
h = RedBlackBST::balance(h);
Temp {
node: Some(h),
target,
}
}
fn max_for(node: &Link<K, V>) -> Option<&K> {
node.as_deref().and_then(|t| {
if t.right.is_some() {
RedBlackBST::max_for(&t.right)
} else {
Some(&t.key)
}
})
}
fn delete_for(node: Link<K, V>, key: &K) -> Link<K, V> {
let mut t = node.expect("如果key在子树中,那么子树一定非none");
let ans = match key.partial_cmp(&t.key).unwrap() {
Ordering::Less => {
let left = t
.left
.as_deref()
.expect("因为小于根节点,所以目标节点一定在left,所以left一定非none");
if !left.is_red() && !left.is_left_red() {
t = t.move_red_left();
}
t.left = RedBlackBST::delete_for(t.left, key);
Some(t)
}
_ => {
if t.is_left_red() {
t = t.rotate_right();
}
if key.partial_cmp(&t.key).unwrap().is_eq() && t.right.is_none() {
return None;
}
let right = t
.right
.as_ref()
.expect("此时目标节点一定在right子树中,所以right不为none");
if !right.is_red() && !right.is_left_red() {
t = t.move_red_right();
}
if key.partial_cmp(&t.key).unwrap().is_eq() {
let Temp { node, mut target } = RedBlackBST::balance_delete_min(t.right.take());
target.color = t.color;
target.left = t.left.take();
target.right = node;
t = target
} else {
t.right = RedBlackBST::delete_for(t.right.take(), key);
}
Some(t)
}
}
.map(|f| RedBlackBST::balance(f));
ans
}
fn balance(mut node: Box<Node<K, V>>) -> Box<Node<K, V>> {
if node.need_rotate_left() {
node = node.rotate_left();
}
if node.need_rotate_right() {
node = node.rotate_right();
}
if node.need_flip_colors() {
node.flip_colors();
}
node.update_n();
node
}
fn rank_for(node: &Link<K, V>, key: &K) -> usize {
if let Some(t) = node {
match key.partial_cmp(&t.key).unwrap() {
Ordering::Less => RedBlackBST::rank_for(&t.left, key),
Ordering::Equal => {
if t.left.is_some() {
t.left.as_deref().unwrap().n
} else {
0
}
}
Ordering::Greater => {
if t.right.is_some() {
let mut n = 1 + RedBlackBST::rank_for(&t.right, key);
if t.left.is_some() {
n += t.left.as_deref().unwrap().n;
}
n
} else {
t.n
}
}
}
} else {
0
}
}
fn select_for(node: &Link<K, V>, k: usize) -> Option<&K> {
node.as_deref().and_then(|t| {
let mut n = 0;
if let Some(left) = &t.left {
n += left.n;
}
match k.partial_cmp(&n).unwrap() {
Ordering::Less => RedBlackBST::select_for(&t.left, k),
Ordering::Equal => Some(&t.key),
Ordering::Greater => RedBlackBST::select_for(&t.right, k - n - 1),
}
})
}
fn floor_for<'a>(node: &'a Link<K, V>, key: &K) -> Option<&'a K> {
node.as_deref().and_then(|t| -> Option<&K> {
match &t.key.partial_cmp(key).unwrap() {
Ordering::Less => RedBlackBST::floor_for(&t.right, key).or(Some(&t.key)),
Ordering::Equal => Some(&t.key),
Ordering::Greater => RedBlackBST::floor_for(&t.left, key),
}
})
}
fn ceiling_for<'a>(node: &'a Link<K, V>, key: &K) -> Option<&'a K> {
node.as_deref().and_then(|t| -> Option<&K> {
match &t.key.partial_cmp(key).unwrap() {
Ordering::Less => RedBlackBST::ceiling_for(&t.right, key),
Ordering::Equal => Some(&t.key),
Ordering::Greater => RedBlackBST::ceiling_for(&t.left, key).or(Some(&t.key)),
}
})
}
}
impl<K: PartialOrd, V> ST<K, V> for RedBlackBST<K, V> {
fn put(&mut self, key: K, value: V) {
self.root = RedBlackBST::put_for(self.root.take(), key, value);
if let Some(it) = self.root.as_mut() {
it.color = Color::Black;
}
}
fn get(&self, key: &K) -> Option<&V> {
RedBlackBST::get_from(&self.root, key)
}
fn delete(&mut self, key: &K) {
if !self.contains(key) {
return;
}
let root = self.root.as_deref_mut().unwrap();
if !root.is_left_red() && !root.is_right_red() {
root.color = Color::Red;
}
self.root = RedBlackBST::delete_for(self.root.take(), key);
if let Some(root) = self.root.as_deref_mut() {
root.color = Color::Black;
}
}
fn is_empty(&self) -> bool {
self.root.is_none()
}
fn size(&self) -> usize {
RedBlackBST::size_for(&self.root)
}
fn min(&self) -> Option<&K> {
RedBlackBST::min_for(&self.root)
}
fn max(&self) -> Option<&K> {
RedBlackBST::max_for(&self.root)
}
fn floor(&self, key: &K) -> Option<&K> {
RedBlackBST::floor_for(&self.root, key)
}
fn ceiling(&self, key: &K) -> Option<&K> {
RedBlackBST::ceiling_for(&self.root, key)
}
fn rank(&self, key: &K) -> usize {
RedBlackBST::rank_for(&self.root, key)
}
fn select(&self, k: usize) -> Option<&K> {
RedBlackBST::select_for(&self.root, k)
}
}