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."); }
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; } } }