private TreeNode <T> Remove(TreeNode <T> parent, T key) { if (parent == null) { return(parent); } if (parent.CompareTo(key) > 0) { parent.Left = Remove(parent.Left, key); } else if (parent.CompareTo(key) < 0) { parent.Right = Remove(parent.Right, key); } else { if (parent.Left == null) { return(parent.Right); } else if (parent.Right == null) { return(parent.Left); } parent.Value = MinValue(parent.Right); ElementRemoved?.Invoke(this, new TreeEventArgs <T>(key, "Element removed")); parent.Right = Remove(parent.Right, parent.Value); } return(parent); }
/// <summary> /// Adds element to the tree according to comparer /// </summary> /// <param name="item">Object that should be added in tree</param> /// <exception cref="ArgumentNullException">Thrown if parameter was null</exception> public void Add(T item) { if (item is null) { throw new ArgumentNullException(nameof(item)); } var newNode = new TreeNode <T>(_comparer) { Value = item }; TreeNode <T> before = null; var after = _head; while (after != null) { before = after; if (_comparer.Compare(after.Value, item) > 0) { after = after.Left; } else if (_comparer.Compare(after.Value, item) < 0) { after = after.Right; } else if (_comparer.Compare(item, after.Value) == 0) { while (!(after is null)) { if (after.Right is null) { after.Right = newNode; Count++; ElementAdded?.Invoke(this, new TreeEventArgs <T>(item, "Aded")); return; } after = after.Right; } } } if (_head == null) { _head = newNode; } else { if (before.CompareTo(item) > 0) { before.Left = newNode; } else { before.Right = newNode; } } ElementAdded?.Invoke(this, new TreeEventArgs <T>(item, "Aded")); Count++; }