コード例 #1
0
ファイル: BinaryTree.cs プロジェクト: FeltMe/BinaryTree
        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);
        }
コード例 #2
0
ファイル: BinaryTree.cs プロジェクト: FeltMe/BinaryTree
        /// <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++;
        }