Skip to content

Instantly share code, notes, and snippets.

@itn3000
Created March 17, 2023 05:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save itn3000/2f2a99cef8c13f63faa19d8ad10c60a3 to your computer and use it in GitHub Desktop.
Save itn3000/2f2a99cef8c13f63faa19d8ad10c60a3 to your computer and use it in GitHub Desktop.
redblack tree code
using System;
public class RedBlackNode<T> where T : IComparable<T>
{
public T Data { get; set; }
public RedBlackNode<T> Left { get; set; }
public RedBlackNode<T> Right { get; set; }
public bool IsRed { get; set; }
}
public class RedBlackTree<T> where T : IComparable<T>
{
private RedBlackNode<T> root;
public RedBlackTree()
{
root = null;
}
public void Add(T data)
{
root = Insert(root, data);
root.IsRed = false;
}
private RedBlackNode<T> Insert(RedBlackNode<T> node, T data)
{
if (node == null)
{
node = new RedBlackNode<T> { Data = data, IsRed = true };
}
else if (data.CompareTo(node.Data) < 0)
{
node.Left = Insert(node.Left, data);
}
else if (data.CompareTo(node.Data) > 0)
{
node.Right = Insert(node.Right, data);
}
// 赤の親と赤の子の関係を調整する
if (IsRed(node.Right) && !IsRed(node.Left))
{
node = RotateLeft(node);
}
if (IsRed(node.Left) && IsRed(node.Left.Left))
{
node = RotateRight(node);
}
if (IsRed(node.Left) && IsRed(node.Right))
{
FlipColors(node);
}
return node;
}
private bool IsRed(RedBlackNode<T> node)
{
if (node == null)
{
return false;
}
return node.IsRed;
}
private RedBlackNode<T> RotateLeft(RedBlackNode<T> node)
{
RedBlackNode<T> temp = node.Right;
node.Right = temp.Left;
temp.Left = node;
temp.IsRed = node.IsRed;
node.IsRed = true;
return temp;
}
private RedBlackNode<T> RotateRight(RedBlackNode<T> node)
{
RedBlackNode<T> temp = node.Left;
node.Left = temp.Right;
temp.Right = node;
temp.IsRed = node.IsRed;
node.IsRed = true;
return temp;
}
private void FlipColors(RedBlackNode<T> node)
{
node.IsRed = true;
node.Left.IsRed = false;
node.Right.IsRed = false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment