BSTNode <T> Root; // корень дерева, или null

        public BST(BSTNode <T> node)
        {
            Root = node;
        }
 public BSTFind()
 {
     Node = null;
 }
Exemple #3
0
 public void GenerateTree()
 {
     Root = AddNode(null, 0); // создаём дерево с нуля из массива BSTArray
 }
        public bool DeleteNodeByKey(int key)
        {
            // удаляем узел по ключу
            BSTFind <T> foundNode = FindNodeByKey(key);

            if (foundNode.NodeHasKey)
            {
                // удаляемый узел не имеет потомков
                if (foundNode.Node.LeftChild == null && foundNode.Node.RightChild == null)
                {
                    if (foundNode.Node.Parent.LeftChild != null && foundNode.Node.Parent.LeftChild.Equals(foundNode.Node))
                    {
                        foundNode.Node.Parent.LeftChild = null;
                    }
                    else if (foundNode.Node.Parent.RightChild != null && foundNode.Node.Parent.RightChild.Equals(foundNode.Node))
                    {
                        foundNode.Node.Parent.RightChild = null;
                    }
                }
                // удаляемый узел имеет только одного потомка
                else if (foundNode.Node.LeftChild == null ^ foundNode.Node.RightChild == null)
                {
                    if (foundNode.Node.LeftChild != null) // левый потомок привязываем к родителю удаленного узла
                    {
                        if (foundNode.Node.Parent.LeftChild != null && foundNode.Node.Parent.LeftChild.Equals(foundNode.Node))
                        {
                            foundNode.Node.Parent.LeftChild = foundNode.Node.LeftChild;
                        }
                        else
                        {
                            foundNode.Node.Parent.RightChild = foundNode.Node.LeftChild;
                        }

                        foundNode.Node.LeftChild.Parent = foundNode.Node.Parent;
                    }
                    else // правый потомок привязываем к родителю удаленного узла
                    {
                        if (foundNode.Node.Parent.LeftChild != null && foundNode.Node.Parent.LeftChild.Equals(foundNode.Node))
                        {
                            foundNode.Node.Parent.LeftChild = foundNode.Node.RightChild;
                        }
                        else
                        {
                            foundNode.Node.Parent.RightChild = foundNode.Node.RightChild;
                        }

                        foundNode.Node.RightChild.Parent = foundNode.Node.Parent;
                    }
                }
                // удаляемый узел имеет двух потомков
                else
                {
                    BSTNode <T> successorNode = FinMinMax(foundNode.Node.RightChild, false); // наименьший потомок, который больше удаляемого узла

                    if (successorNode.RightChild != null)                                    // если наименьший потомок не является листом
                    {
                        successorNode.Parent.LeftChild  = successorNode.RightChild;          // передаем его правого потомка левым узлом родителю
                        successorNode.RightChild.Parent = successorNode.Parent;              // правому потомку назначаем родителя
                    }
                    else
                    {
                        if (successorNode.Parent.LeftChild == successorNode)
                        {
                            successorNode.Parent.LeftChild = null; // удаляем левый лист
                        }
                        else
                        {
                            successorNode.Parent.RightChild = null; // удаляем правый лист
                        }
                    }
                    // преемник замещает удаленный узел
                    if (foundNode.Node.Parent.RightChild == foundNode.Node)
                    {
                        foundNode.Node.Parent.RightChild = successorNode;
                    }
                    else
                    {
                        foundNode.Node.Parent.LeftChild = successorNode;
                    }

                    successorNode.Parent = foundNode.Node.Parent;         // новый родитель для узла-преемника

                    successorNode.LeftChild  = foundNode.Node.LeftChild;  // левый потомок удаленного узла становится потомком узла-преемника
                    successorNode.RightChild = foundNode.Node.RightChild; // правый потомок удаленного узла становится потомком узла-преемника

                    // связать потомков удаленного узла с новым родителем
                    if (foundNode.Node.RightChild != null)
                    {
                        foundNode.Node.RightChild.Parent = successorNode;
                    }
                    if (foundNode.Node.LeftChild != null)
                    {
                        foundNode.Node.LeftChild.Parent = successorNode;
                    }
                }

                return(true);
            }

            return(false); // если узел не найден
        }
Exemple #5
0
        public int[] BSTArray; // временный массив для ключей дерева

        public BalancedBST()
        {
            Root = null;
        }