コード例 #1
0
ファイル: BinaryTree.cs プロジェクト: sanynikonov/Tasks1-5
 public void Add(T value)
 {
     if (root == null)
     {
         root = new Node <T>(value);
     }
     else
     {
         RecursiveAdd(root, value);
     }
     if (NodeAdded != null)
     {
         TreeEventArgs e = new TreeEventArgs();
         e.Value = value;
         NodeAdded(this, e);
     }
 }
コード例 #2
0
ファイル: BinaryTree.cs プロジェクト: sanynikonov/Tasks1-5
        public bool Remove(T value)
        {
            //Node<T> node = FindNodeByValue(root, value);
            Node <T> node = root;

            do
            {
                if (value.CompareTo(node.Value) < 0)
                {
                    node = node.LeftChild;
                }
                else if (value.CompareTo(node.Value) > 0)
                {
                    node = node.RightChild;
                }

                if (node == null)
                {
                    return(false);
                }
            } while (value.CompareTo(node.Value) != 0);

            if (node == null)
            {
                return(false);
            }
            if (node != null)
            {
                int result = node.Value.CompareTo(node.Parent.Value);
                if (node.LeftChild == null && node.RightChild == null) // перший випадок - нема дітей
                {
                    if (node.Parent.LeftChild == node)
                    {
                        node.Parent.LeftChild = null;
                    }
                    else
                    {
                        node.Parent.RightChild = null;
                    }
                }
                else if ((node.LeftChild == null && node.RightChild != null) ||
                         (node.LeftChild != null && node.RightChild != null)) // другий випадок - одна дитина
                {
                    if (node.LeftChild == null)
                    {
                        if (node.Parent.LeftChild == node)
                        {
                            node.Parent.LeftChild = node.RightChild;
                        }
                        else
                        {
                            node.Parent.RightChild = node.RightChild;
                        }
                    }
                    else
                    {
                        if (node.Parent.LeftChild == node)
                        {
                            node.Parent.LeftChild = node.LeftChild;
                        }
                        else
                        {
                            node.Parent.RightChild = node.LeftChild;
                        }
                    }
                }
                else // третій випадок - є дві дитини
                {
                    Node <T> succesor = node.RightChild;
                    while (succesor.LeftChild != null)
                    {
                        succesor = succesor.LeftChild;
                    }

                    node.Value = succesor.Value;
                    if (succesor.Parent.LeftChild == succesor)
                    {
                        succesor.Parent.LeftChild = succesor.RightChild;
                        if (succesor.RightChild != null)
                        {
                            succesor.RightChild.Parent = succesor.Parent;
                        }
                    }
                    else
                    {
                        succesor.Parent.RightChild = succesor.LeftChild;
                        if (succesor.LeftChild != null)
                        {
                            succesor.RightChild.Parent = succesor.Parent;
                        }
                    }
                }
            }
            if (NodeRemoved != null)
            {
                TreeEventArgs e = new TreeEventArgs();
                e.Value = value;
                NodeRemoved(this, e);
            }
            return(true);
        }