public void TakeElementFromNextRightSibling(TreeNode p, TreeNode node, int n) { node.elements[0] = p.elements[n]; p.elements[n] = p.children[n + 1].elements[0]; if (this.limit == 2) { p.children[n + 1].elements[0] = p.children[n + 1].elements[1]; p.children[n + 1].elements[1] = 0; } else { p.children[n + 1].elements[0] = p.children[n + 1].elements[1]; p.children[n + 1].elements[1] = p.children[n + 1].elements[2]; p.children[n + 1].elements[2] = 0; } if (node.IsLeaf() == false) { node.children[1] = p.children[n + 1].children[0]; if (this.limit == 2) { p.children[n + 1].children[0] = p.children[n + 1].children[1]; p.children[n + 1].children[1] = p.children[n + 1].children[2]; p.children[n + 1].children[2] = null; } else { p.children[n + 1].children[0] = p.children[n + 1].children[1]; p.children[n + 1].children[1] = p.children[n + 1].children[2]; p.children[n + 1].children[2] = p.children[n + 1].children[3]; p.children[n + 1].children[3] = null; } node.children[1].parent = node; } }
public override void Split(TreeNode twoFourNode, int element) { TwoFourTreeNode p; twoFourNode = (TwoFourTreeNode) twoFourNode; if (twoFourNode.parent == null) { p = new TwoFourTreeNode(); } else { p = (TwoFourTreeNode) twoFourNode.parent; } TwoFourTreeNode n1 = new TwoFourTreeNode(); TwoFourTreeNode n2 = new TwoFourTreeNode(); int[] elements = { element, twoFourNode.elements[0], twoFourNode.elements[1], twoFourNode.elements[2] }; int middle; this.SortElements(elements, elements.Length); n1.elements[0] = elements[0]; n1.elements[1] = elements[1]; n2.elements[0] = elements[3]; middle = elements[2]; n1.parent = p; n2.parent = p; if (p.NumberOfElements() == 0) { p.children[0] = n1; p.children[1] = n2; this.root = p; } else if (p.NumberOfElements() == 1) { if (n2.elements[0] < p.elements[0]) { p.children[2] = p.children[1]; p.children[0] = n1; p.children[1] = n2; } else { p.children[1] = n1; p.children[2] = n2; } } else if (p.NumberOfElements() == 2) { if (n2.elements[0] < p.elements[0] && n2.elements[0] < p.elements[1]) { p.children[3] = p.children[2]; p.children[2] = p.children[1]; p.children[0] = n1; p.children[1] = n2; } else if (n1.elements[1] > p.elements[0] && n1.elements[1] > p.elements[1]) { p.children[2] = n1; p.children[3] = n2; } else { p.children[3] = p.children[2]; p.children[1] = n1; p.children[2] = n2; } } else if (p.NumberOfElements() == 3) { if (n2.elements[0] < p.elements[0]) { p.children[4] = p.children[3]; p.children[3] = p.children[2]; p.children[2] = p.children[1]; p.children[1] = n2; p.children[0] = n1; } else if (n1.elements[0] > p.elements[0] && n2.elements[0] < p.elements[1]) { p.children[4] = p.children[3]; p.children[3] = p.children[2]; p.children[2] = n2; p.children[1] = n1; } else if (n1.elements[0] > p.elements[1] && n2.elements[0] < p.elements[2]) { p.children[4] = p.children[3]; p.children[3] = n2; p.children[2] = n1; } else { p.children[3] = n1; p.children[4] = n2; } } //if it is not a leaf check if (twoFourNode.IsLeaf() == false) { twoFourNode.children[0].parent = n1; twoFourNode.children[1].parent = n1; twoFourNode.children[2].parent = n1; twoFourNode.children[3].parent = n2; twoFourNode.children[4].parent = n2; n1.children[0] = twoFourNode.children[0]; n1.children[1] = twoFourNode.children[1]; n1.children[2] = twoFourNode.children[2]; n2.children[0] = twoFourNode.children[3]; n2.children[1] = twoFourNode.children[4]; } if (p.NumberOfElements() == 3) { this.Split(p, middle); } else if (p.NumberOfElements() < this.limit) { p.elements[p.NumberOfElements()] = middle; this.SortElements(p.elements, p.NumberOfElements()); } }
public void TakeElementFromTwoNextRightSibling(TreeNode p, TreeNode node, int n) { node.elements[0] = p.elements[n]; p.elements[n] = p.children[n + 1].elements[0]; p.children[n + 1].elements[0] = p.elements[n + 1]; p.elements[n + 1] = p.children[n + 2].elements[0]; if (p.children[n + 2].NumberOfElements() == 2) { p.children[n + 2].elements[0] = p.children[n + 2].elements[1]; p.children[n + 2].elements[1] = 0; } else if (p.children[n + 2].NumberOfElements() == 3) { p.children[n + 2].elements[0] = p.children[n + 2].elements[1]; p.children[n + 2].elements[1] = p.children[n + 2].elements[2]; p.children[n + 2].elements[2] = 0; } if (node.IsLeaf() == false) { node.children[1] = p.children[n + 1].children[0]; p.children[n + 1].children[0] = p.children[n + 1].children[1]; p.children[n + 1].children[1] = p.children[n + 2].children[0]; if (p.children[n + 2].NumberOfElements() == 1) { p.children[n + 2].children[0] = p.children[n + 2].children[1]; p.children[n + 2].children[1] = p.children[n + 2].children[2]; p.children[n + 2].children[2] = null; } else if (p.children[n + 2].NumberOfElements() == 2) { p.children[n + 2].children[0] = p.children[n + 2].children[1]; p.children[n + 2].children[1] = p.children[n + 2].children[2]; p.children[n + 2].children[2] = p.children[n + 2].children[3]; p.children[n + 2].children[3] = null; } node.children[1].parent = node; p.children[n + 1].children[1].parent = p.children[n + 1]; } }
public void TakeElementFromNextRightSibling(TreeNode p, TreeNode node, int n) { node.elements[0] = p.elements[n]; p.elements[n] = p.children[n + 1].elements[0]; if (this.limit == 2) { p.children[n + 1].elements[0] = p.children[n + 1].elements[1]; p.children[n + 1].elements[1] = 0; } else { p.children[n + 1].elements[0] = p.children[n + 1].elements[1]; p.children[n + 1].elements[1] = p.children[n + 1].elements[2]; p.children[n + 1].elements[2] = 0; } if (node.IsLeaf() == false) { node.children[1] = p.children[n + 1].children[0]; if (this.limit == 2) { p.children[n + 1].children[0] = p.children[n + 1].children[1]; p.children[n + 1].children[1] = p.children[n + 1].children[2]; p.children[n + 1].children[2] = null; } else { p.children[n + 1].children[0] = p.children[n + 1].children[1]; p.children[n + 1].children[1] = p.children[n + 1].children[2]; p.children[n + 1].children[2] = p.children[n + 1].children[3]; p.children[n + 1].children[3] = null; } node.children[1].parent = node; } }
public void Merge(TreeNode node) { if (node.parent.NumberOfElements() == 1) { //empty node at the left if (node.parent.children[0] == node) { node.parent.children[1].elements[1] = node.parent.children[1].elements[0]; node.parent.children[1].elements[0] = node.parent.elements[0]; node.parent.elements[0] = 0; //remove the node node.parent.children[0] = node.parent.children[1]; node.parent.children[1] = null; //if node is internal if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.parent.children[0].children[1]; node.parent.children[0].children[1] = node.parent.children[0].children[0]; node.parent.children[0].children[0] = node.children[0]; //update the parent node.parent.children[0].children[0].parent = node.parent.children[0]; } } //empty node at the right else { node.parent.children[0].elements[1] = node.parent.elements[0]; node.parent.elements[0] = 0; node.parent.children[1] = null; //if node is internal if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.children[0]; node.parent.children[0].children[2].parent = node.parent.children[0]; } } } else if (node.parent.NumberOfElements() == 2) { //empty node at the left if (node.parent.children[0] == node) { node.parent.children[1].elements[1] = node.parent.children[1].elements[0]; node.parent.children[1].elements[0] = node.parent.elements[0]; node.parent.elements[0] = node.parent.elements[1]; node.parent.elements[1] = 0; node.parent.children[0] = node.parent.children[1]; node.parent.children[1] = node.parent.children[2]; node.parent.children[2] = null; //if node is internal if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.parent.children[0].children[1]; node.parent.children[0].children[1] = node.parent.children[0].children[0]; node.parent.children[0].children[0] = node.children[0]; node.parent.children[0].children[0].parent = node.parent.children[0]; } } //empty node at the middle else if (node.parent.children[1] == node) { node.parent.children[0].elements[1] = node.parent.elements[0]; node.parent.elements[0] = node.parent.elements[1]; node.parent.elements[1] = 0; node.parent.children[1] = node.parent.children[2]; node.parent.children[2] = null; //if node is internal if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.children[0]; node.parent.children[0].children[2].parent = node.parent.children[0]; } } //empty node at the right else { node.parent.children[1].elements[1] = node.parent.elements[1]; node.parent.elements[1] = 0; node.parent.children[2] = null; //if node is internal if (node.IsLeaf() == false) { node.parent.children[1].children[2] = node.children[0]; node.parent.children[1].children[2].parent = node.parent.children[1]; } } } else if (node.parent.NumberOfElements() == 3) { if (node.parent.children[0] == node) { node.parent.children[1].elements[1] = node.parent.children[1].elements[0]; node.parent.children[1].elements[0] = node.parent.elements[0]; node.parent.elements[0] = node.parent.elements[1]; node.parent.elements[1] = node.parent.elements[2]; node.parent.elements[2] = 0; node.parent.children[0] = node.parent.children[1]; node.parent.children[1] = node.parent.children[2]; node.parent.children[2] = node.parent.children[3]; node.parent.children[3] = null; //if node is internal if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.parent.children[0].children[1]; node.parent.children[0].children[1] = node.parent.children[0].children[0]; node.parent.children[0].children[0] = node.children[0]; node.parent.children[0].children[0].parent = node.parent.children[0]; } } else if (node.parent.children[1] == node) { node.parent.children[0].elements[1] = node.parent.elements[0]; node.parent.elements[0] = node.parent.elements[1]; node.parent.elements[1] = node.parent.elements[2]; node.parent.elements[2] = 0; node.parent.children[1] = node.parent.children[2]; node.parent.children[2] = node.parent.children[3]; node.parent.children[3] = null; //if node is internal if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.children[0]; node.parent.children[0].children[2].parent = node.parent.children[0]; } } else if (node.parent.children[2] == node) { node.parent.children[1].elements[1] = node.parent.elements[1]; node.parent.elements[1] = node.parent.elements[2]; node.parent.elements[2]= 0; node.parent.children[2] = node.parent.children[3]; node.parent.children[3] = null; //if node is internal if (node.IsLeaf() == false) { node.parent.children[1].children[2] = node.children[0]; node.parent.children[1].children[2].parent = node.parent.children[1]; } } else if (node.parent.children[3] == node) { node.parent.children[2].elements[1] = node.parent.elements[2]; node.parent.elements[2] = 0; node.parent.children[3] = null; //if node is internal if (node.IsLeaf() == false) { node.parent.children[2].children[2] = node.children[0]; node.parent.children[2].children[2].parent = node.parent.children[2]; } } } }
public TreeNode FindSubtreeLeaf(TreeNode node, int element) { if (node.IsLeaf()) return node; else { if (element < node.elements[0]) return this.FindSubtreeLeaf(node.children[0], element); else if (node.NumberOfElements() == 1 || (element > node.elements[0] && element < node.elements[1])) return this.FindSubtreeLeaf(node.children[1], element); else if (node.NumberOfElements() == 2 || (element > node.elements[1] && element < node.elements[2])) return this.FindSubtreeLeaf(node.children[2], element); else return this.FindSubtreeLeaf(node.children[3], element); } }
//Recursively split to balance the tree public override void Split(TreeNode twoThreeNode, int element) { TwoThreeTreeNode p; if (twoThreeNode.parent == null) { p = new TwoThreeTreeNode(); } else { p = (TwoThreeTreeNode) twoThreeNode.parent; } TwoThreeTreeNode n1 = new TwoThreeTreeNode(); TwoThreeTreeNode n2 = new TwoThreeTreeNode(); //finding the smallest, middle and large elements int small, middle, large; if (element < twoThreeNode.elements[0]) { small = element; middle = twoThreeNode.elements[0]; large = twoThreeNode.elements[1]; } else if (element > twoThreeNode.elements[1]) { small = twoThreeNode.elements[0]; middle = twoThreeNode.elements[1]; large = element; } else { small = twoThreeNode.elements[0]; middle = element; large = twoThreeNode.elements[1]; } //set smallest and largest keys to the n1 and n2 respectively n1.elements[0] = small; n2.elements[0] = large; //Make p the parent node of n1 and n2 n1.parent = p; n2.parent = p; if (p.NumberOfElements() == 0) { p.children[0] = n1; p.children[1] = n2; this.root = p; n1.isLeaf = true; n2.isLeaf = true; } else if (p.NumberOfElements() == 1) { if (n2.elements[0] < p.elements[0]) { p.children[2] = p.children[1]; p.children[0] = n1; p.children[1] = n2; } else { p.children[1] = n1; p.children[2] = n2; } n1.isLeaf = true; n2.isLeaf = true; } else { if (n2.elements[0] < p.elements[0] && n2.elements[0] < p.elements[1]) { p.children[3] = p.children[2]; p.children[2] = p.children[1]; p.children[0] = n1; p.children[1] = n2; } else if (n1.elements[0] > p.elements[0] && n1.elements[0] > p.elements[1]) { p.children[2] = n1; p.children[3] = n2; } else { p.children[3] = p.children[2]; p.children[1] = n1; p.children[2] = n2; } } //if it is not a leaf check if (twoThreeNode.IsLeaf() == false) { twoThreeNode.children[0].parent = n1; twoThreeNode.children[1].parent = n1; twoThreeNode.children[2].parent = n2; twoThreeNode.children[3].parent = n2; n1.children[0] = twoThreeNode.children[0]; n1.children[1] = twoThreeNode.children[1]; n2.children[0] = twoThreeNode.children[2]; n2.children[1] = twoThreeNode.children[3]; n1.isLeaf = false; n2.isLeaf = false; } if (p.NumberOfElements() == 2) { this.Split(p, middle); if (n1.children[0] != null || n2.children[0] != null) { if (n1.children[0].IsLeaf() || n2.children[0].IsLeaf()) { n1.isLeaf = false; n2.isLeaf = false; } } else { n1.isLeaf = true; n2.isLeaf = true; } n1.parent.isLeaf = false; n2.parent.isLeaf = false; } else if (p.NumberOfElements() == 1) { if (p.elements[0] < middle) { p.elements[1] = middle; } else { p.elements[1] = p.elements[0]; p.elements[0] = middle; } } else { p.elements[0] = middle; } }
public override void Split(TreeNode twoThreeNode, int element) { TwoThreeTreeNode p; if (twoThreeNode.parent == null) { p = new TwoThreeTreeNode(); } else { p = (TwoThreeTreeNode)twoThreeNode.parent; } TwoThreeTreeNode n1 = new TwoThreeTreeNode(); TwoThreeTreeNode n2 = new TwoThreeTreeNode(); int small, middle, large; if (element < twoThreeNode.elements[0]) { small = element; middle = twoThreeNode.elements[0]; large = twoThreeNode.elements[1]; } else if (element > twoThreeNode.elements[1]) { small = twoThreeNode.elements[0]; middle = twoThreeNode.elements[1]; large = element; } else { small = twoThreeNode.elements[0]; middle = element; large = twoThreeNode.elements[1]; } n1.elements[0] = small; n2.elements[0] = large; n1.parent = p; n2.parent = p; if (p.NumberOfElements() == 0) { p.children[0] = n1; p.children[1] = n2; root = p; n1.isLeaf = true; n2.isLeaf = true; } else if (p.NumberOfElements() == 1) { if (n2.elements[0] < p.elements[0]) { p.children[2] = p.children[1]; p.children[0] = n1; p.children[1] = n2; } else { p.children[1] = n1; p.children[2] = n2; } n1.isLeaf = true; n2.isLeaf = true; } else { if (n2.elements[0] < p.elements[0] && n2.elements[0] < p.elements[1]) { p.children[3] = p.children[2]; p.children[2] = p.children[1]; p.children[0] = n1; p.children[1] = n2; } else if (n1.elements[0] > p.elements[0] && n1.elements[0] > p.elements[1]) { p.children[2] = n1; p.children[3] = n2; } else { p.children[3] = p.children[2]; p.children[1] = n1; p.children[2] = n2; } } if (twoThreeNode.IsLeaf() == false) { twoThreeNode.children[0].parent = n1; twoThreeNode.children[1].parent = n1; twoThreeNode.children[2].parent = n2; twoThreeNode.children[3].parent = n2; n1.children[0] = twoThreeNode.children[0]; n1.children[1] = twoThreeNode.children[1]; n2.children[0] = twoThreeNode.children[2]; n2.children[1] = twoThreeNode.children[3]; n1.isLeaf = false; n2.isLeaf = false; } if (p.NumberOfElements() == 2) { Split(p, middle); if (n1.children[0] != null || n2.children[0] != null) { if (n1.children[0].IsLeaf() || n2.children[0].IsLeaf()) { n1.isLeaf = false; n2.isLeaf = false; } } else { n1.isLeaf = true; n2.isLeaf = true; } n1.parent.isLeaf = false; n2.parent.isLeaf = false; } else if (p.NumberOfElements() == 1) { if (p.elements[0] < middle) { p.elements[1] = middle; } else { p.elements[1] = p.elements[0]; p.elements[0] = middle; } } else { p.elements[0] = middle; } }
public void Merge(TreeNode node) { if (node.parent.NumberOfElements() == 1) { if (node.parent.children[0] == node) { node.parent.children[1].elements[1] = node.parent.children[1].elements[0]; node.parent.children[1].elements[0] = node.parent.elements[0]; node.parent.elements[0] = 0; node.parent.children[0] = node.parent.children[1]; node.parent.children[1] = null; if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.parent.children[0].children[1]; node.parent.children[0].children[1] = node.parent.children[0].children[0]; node.parent.children[0].children[0] = node.children[0]; node.parent.children[0].children[0].parent = node.parent.children[0]; } } else { node.parent.children[0].elements[1] = node.parent.elements[0]; node.parent.elements[0] = 0; node.parent.children[1] = null; if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.children[0]; node.parent.children[0].children[2].parent = node.parent.children[0]; } } } else if (node.parent.NumberOfElements() == 2) { if (node.parent.children[0] == node) { node.parent.children[1].elements[1] = node.parent.children[1].elements[0]; node.parent.children[1].elements[0] = node.parent.elements[0]; node.parent.elements[0] = node.parent.elements[1]; node.parent.elements[1] = 0; node.parent.children[0] = node.parent.children[1]; node.parent.children[1] = node.parent.children[2]; node.parent.children[2] = null; if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.parent.children[0].children[1]; node.parent.children[0].children[1] = node.parent.children[0].children[0]; node.parent.children[0].children[0] = node.children[0]; node.parent.children[0].children[0].parent = node.parent.children[0]; } } else if (node.parent.children[1] == node) { node.parent.children[0].elements[1] = node.parent.elements[0]; node.parent.elements[0] = node.parent.elements[1]; node.parent.elements[1] = 0; node.parent.children[1] = node.parent.children[2]; node.parent.children[2] = null; if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.children[0]; node.parent.children[0].children[2].parent = node.parent.children[0]; } } else { node.parent.children[1].elements[1] = node.parent.elements[1]; node.parent.elements[1] = 0; node.parent.children[2] = null; if (node.IsLeaf() == false) { node.parent.children[1].children[2] = node.children[0]; node.parent.children[1].children[2].parent = node.parent.children[1]; } } } else if (node.parent.NumberOfElements() == 3) { if (node.parent.children[0] == node) { node.parent.children[1].elements[1] = node.parent.children[1].elements[0]; node.parent.children[1].elements[0] = node.parent.elements[0]; node.parent.elements[0] = node.parent.elements[1]; node.parent.elements[1] = node.parent.elements[2]; node.parent.elements[2] = 0; node.parent.children[0] = node.parent.children[1]; node.parent.children[1] = node.parent.children[2]; node.parent.children[2] = node.parent.children[3]; node.parent.children[3] = null; if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.parent.children[0].children[1]; node.parent.children[0].children[1] = node.parent.children[0].children[0]; node.parent.children[0].children[0] = node.children[0]; node.parent.children[0].children[0].parent = node.parent.children[0]; } } else if (node.parent.children[1] == node) { node.parent.children[0].elements[1] = node.parent.elements[0]; node.parent.elements[0] = node.parent.elements[1]; node.parent.elements[1] = node.parent.elements[2]; node.parent.elements[2] = 0; node.parent.children[1] = node.parent.children[2]; node.parent.children[2] = node.parent.children[3]; node.parent.children[3] = null; if (node.IsLeaf() == false) { node.parent.children[0].children[2] = node.children[0]; node.parent.children[0].children[2].parent = node.parent.children[0]; } } else if (node.parent.children[2] == node) { node.parent.children[1].elements[1] = node.parent.elements[1]; node.parent.elements[1] = node.parent.elements[2]; node.parent.elements[2] = 0; node.parent.children[2] = node.parent.children[3]; node.parent.children[3] = null; if (node.IsLeaf() == false) { node.parent.children[1].children[2] = node.children[0]; node.parent.children[1].children[2].parent = node.parent.children[1]; } } else if (node.parent.children[3] == node) { node.parent.children[2].elements[1] = node.parent.elements[2]; node.parent.elements[2] = 0; node.parent.children[3] = null; if (node.IsLeaf() == false) { node.parent.children[2].children[2] = node.children[0]; node.parent.children[2].children[2].parent = node.parent.children[2]; } } } }
public TreeNode DeleteElement(int element) { int inOrderInd; TreeNode leafNode; TreeNode inOrderSuccessor; int tempElement; TreeNode shouldFixed = null; TreeNode node = FindNode(root, element); if (node != null) { int ind = node.elements[0] == element ? 0 : node.elements[1] == element ? 1 : 2; if (node.IsLeaf() == false) { inOrderSuccessor = InOrderSuccessor(element, node); inOrderInd = 0; tempElement = node.elements[ind]; node.elements[ind] = inOrderSuccessor.elements[inOrderInd]; inOrderSuccessor.elements[inOrderInd] = tempElement; leafNode = inOrderSuccessor; } else { leafNode = node; } if (element == leafNode.elements[0]) { if (leafNode.NumberOfElements() == 1) { leafNode.elements[0] = 0; } else if (leafNode.NumberOfElements() == 2) { leafNode.elements[0] = leafNode.elements[1]; leafNode.elements[1] = 0; } else { leafNode.elements[0] = leafNode.elements[1]; leafNode.elements[1] = leafNode.elements[2]; leafNode.elements[2] = 0; } } else if (element == leafNode.elements[1]) { if (leafNode.NumberOfElements() == 2) { leafNode.elements[1] = 0; } else { leafNode.elements[1] = leafNode.elements[2]; leafNode.elements[2] = 0; } } else if (element == leafNode.elements[2]) { leafNode.elements[2] = 0; } else { Console.WriteLine("There must be a mistake, element couldn't be found in the node!"); } if (leafNode.NumberOfElements() == 0) { shouldFixed = leafNode; } } else { Console.WriteLine(element + " Couldn't found in the tree, thus process terminated"); } return(shouldFixed); }