Created
March 17, 2023 05:07
-
-
Save itn3000/2f2a99cef8c13f63faa19d8ad10c60a3 to your computer and use it in GitHub Desktop.
redblack tree code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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