public void Add(int value) { if (value < Value) { if (Left == null) { Left = new RBTree(value, this); } else { Left.Add(value); } } else { if (Right == null) { Right = new RBTree(value, this); } else { Right.Add(value); } } }
private void Print(RBTree tree) { if (tree.Left != null) { Print(tree.Left); } Console.Write(tree.Value + " "); if (tree.Right != null) { Print(tree.Right); } }
static void Main(string[] args) { RBTree tree = null; while (true) { Console.WriteLine("Меню:"); Console.WriteLine("0 Добавленеие элемента"); Console.WriteLine("1 Удаление элемента"); Console.WriteLine("2 Вывод дерева"); int a = Int32.Parse(Console.ReadLine()); int value = 0; if (a < 2) { Console.WriteLine("Введите значение элемента"); value = Int32.Parse(Console.ReadLine()); } switch (a) { case 0: { if (tree == null) { tree = new RBTree(value); } else { tree.Add(value); } break; } case 1: { if (tree == null) { Console.WriteLine("Дерево пусто"); } else { tree.Remove(value); } break; } case 2: { if (tree == null) { Console.WriteLine("Дерево пусто"); } else { tree.Print(); } break; } } } }
private void Remove(RBTree tree) { if (tree == null) { return; } //Корень if (tree.Parent == null) { if (tree.Left != null) { tree.Value = tree.Left.Value; Remove(tree.Left); } else if (tree.Right != null) { tree.Value = tree.Right.Value; Remove(tree.Right); } else { ;//TODO: удаление последнего элемента } return; } //Лист if (tree.Left == null && tree.Right == null) { if (tree.Parent.Left == tree) { tree.Parent.Left = null; } else { tree.Parent.Right = null; } } //Узел с левым поддеревом if (tree.Left != null && tree.Right == null) { tree.Left.Parent = tree.Parent; if (tree.Parent.Left == tree) { tree.Parent.Left = tree.Left; } else { tree.Parent.Right = tree.Left; } } ///Узел с правым поддеревом if (tree.Left == null && tree.Right != null) { tree.Right.Parent = tree.Parent; if (tree.Parent.Left == tree) { tree.Parent.Left = tree.Right; } else { tree.Parent.Right = tree.Right; } } ///Узел с правым и левым поддеревом if (tree.Left != null && tree.Right != null) { RBTree current = tree.Right; while (current.Left != null) { current = current.Left; } tree.Value = current.Value; Remove(current); } }
public RBTree(int value, RBTree parent = null) { Value = value; Parent = parent; }
public void Remove(int value) { RBTree tree = Search(value); Remove(tree); }