コード例 #1
0
 private void btnDeleteTree_Click(object sender, EventArgs e)
 {
     rbTree.Reset();
     RBTree.ResetDefaultLength();
     rtbTree.Text = "Obrisali su se svi čvorovi stabla.\n";
     stepsForm.AddStep("Brišu se svi čvorovi stabla.");
 }
コード例 #2
0
        public void AddElement(int value)
        {
            if (value.ToString().Length + 2 > RBTree.defaultPrintNodeLength)
            {
                int newLength = value.ToString().Length + 2;
                if (newLength % 2 == 1)
                {
                    newLength += 1;
                }
                RBTree.defaultPrintNodeLength = newLength;
            }
            newNode = new RBTreeNode(value, true);
            stepsForm.AddStep("Dodaje se novi čvor N crvene boje: " + newNode + ".");
            if (root == null)
            {
                root = newNode;
                stepsForm.AddSubStep(string.Format("Novi čvor N {0} je korijen stabla, boja mu se mijenja u crnu.",
                                                   newNode));
                root.isRed = false;
            }
            else
            {
                InsertIntoTree(value);
                RBTreeNode parent = newNode.parentNode;
                if (!parent.isRed)
                {
                    stepsForm.AddSubStep("Roditelj P " + parent + " je crne boje. Nema potrebe za rekonstrukcijom.");
                }
                while (newNode.parentNode != null && newNode.parentNode.isRed)
                {
                    stepsForm.AddSubStep(string.Format("Roditelj P {0} je crvene boje.",
                                                       newNode.parentNode));
                    RBTreeNode grandparent = newNode.parentNode.parentNode;
                    RBTreeNode uncle;
                    // p(N) == g(N).left
                    if (newNode.parentNode == newNode.parentNode.parentNode.leftNode)
                    {
                        uncle = newNode.parentNode.parentNode.rightNode;
                        stepsForm.AddSubStep(string.Format("P {0} je lijevo dijete od djeda G {1}. " +
                                                           "Ujak U {2} je desno dijete od G {1}.",
                                                           newNode.parentNode, newNode.parentNode.parentNode, uncle));
                        if (uncle != null && uncle.isRed)
                        {
                            stepsForm.AddSubStep(string.Format("U {0} je crven. P {1} postaje crn, " +
                                                               "U {0} postaje crn, G {2} postaje crven.",
                                                               uncle, newNode.parentNode, newNode.parentNode.parentNode));
                            newNode.parentNode.isRed = false;
                            uncle.isRed = false;
                            newNode.parentNode.parentNode.isRed = true;
                            newNode = newNode.parentNode.parentNode;
                        }
                        else
                        {
                            parent      = newNode.parentNode;
                            grandparent = parent.parentNode;
                            stepsForm.AddSubStep(string.Format("U {0} je crn.", uncle));
                            if (newNode == parent.rightNode)
                            {
                                stepsForm.AddSubStep(string.Format("Novi čvor N {0} je desno dijete od P {1}. " +
                                                                   "Obavlja se lijeva rotacija N {0} oko P {1}.",
                                                                   newNode, parent));
                                grandparent.leftNode = newNode;
                                FixParent(grandparent.leftNode, grandparent);

                                parent.rightNode = newNode.leftNode;
                                FixParent(parent.rightNode, parent);

                                newNode.leftNode = parent;
                                FixParent(newNode.leftNode, newNode);

                                stepsForm.AddSubStep(string.Format("N {0} postaje P {1}.",
                                                                   newNode, parent));
                                newNode = parent;
                            }
                            RBTreeNode tempParent           = newNode.parentNode;
                            RBTreeNode tempGrandparent      = tempParent.parentNode;
                            RBTreeNode tempGrandGrandparent = tempGrandparent.parentNode;
                            stepsForm.AddSubStep(string.Format("Obavlja se desna rotacija roditelja od N p(N) {0} oko djeda od N g(N) {1}.",
                                                               tempParent, tempGrandparent));

                            Rotation(newNode.parentNode, newNode.parentNode.parentNode, true);
                            stepsForm.AddSubStep(string.Format("P {0} postaje crn, G {1} postaje crven.",
                                                               newNode.parentNode, newNode.parentNode.parentNode));
                            if (newNode.parentNode != null)
                            {
                                newNode.parentNode.isRed = false;
                            }
                            newNode.parentNode.parentNode.isRed = true;
                        }
                    }
                    else
                    {
                        uncle = newNode.parentNode.parentNode.leftNode;
                        stepsForm.AddSubStep(string.Format("P {0} je desno dijete od djeda G {1}. Ujak U {2} je lijevo dijete od G {1}.",
                                                           parent, grandparent, uncle));
                        if (uncle != null && uncle.isRed)
                        {
                            stepsForm.AddSubStep(string.Format("U {0} je crven. P {1} postaje crn, U {0} postaje crn, G {2} postaje crven.",
                                                               uncle, newNode.parentNode, newNode.parentNode.parentNode));
                            newNode.parentNode.isRed = false;
                            uncle.isRed = false;
                            newNode.parentNode.parentNode.isRed = true;
                            newNode = newNode.parentNode.parentNode;
                        }
                        else
                        {
                            parent      = newNode.parentNode;
                            grandparent = parent.parentNode;
                            stepsForm.AddSubStep(string.Format("U {0} je crn.",
                                                               uncle));
                            if (newNode == parent.leftNode)
                            {
                                stepsForm.AddSubStep(string.Format("Novi čvor N {0} je lijevo dijete od P {1}. Obavlja se desna rotacija N {0} oko P {1}.",
                                                                   newNode, parent));
                                grandparent.rightNode = newNode;
                                FixParent(grandparent.rightNode, grandparent);

                                parent.leftNode = newNode.rightNode;
                                FixParent(parent.leftNode, parent);
                                newNode.rightNode = parent;
                                FixParent(newNode.rightNode, newNode);
                                stepsForm.AddSubStep(string.Format("N {0} postaje P {1}.",
                                                                   newNode, parent));
                                newNode = parent;
                            }
                            RBTreeNode tempParent           = newNode.parentNode;
                            RBTreeNode tempGrandparent      = tempParent.parentNode;
                            RBTreeNode tempGrandGrandparent = tempGrandparent.parentNode;
                            stepsForm.AddSubStep(string.Format("Obavlja se lijeva rotacija roditelja od N p(N) {0} oko djeda od N g(N) {1}.",
                                                               tempParent, tempGrandparent));
                            Rotation(newNode.parentNode, newNode.parentNode.parentNode, false);
                            stepsForm.AddSubStep(string.Format("P {0} postaje crn, G {1} postaje crven.",
                                                               newNode.parentNode, newNode.parentNode.parentNode));
                            if (newNode.parentNode != null)
                            {
                                newNode.parentNode.isRed = false;
                            }
                            grandparent.isRed = true;
                        }
                    }
                }
                RBTreeNode node = parent;
                while (node.parentNode != null)
                {
                    node = node.parentNode;
                }
                if (node.isRed)
                {
                    stepsForm.AddSubStep(string.Format("Korijen {0} postaje crn.", root));
                    node.isRed = false;
                }
            }
        }