/// <summary> /// Corects tree. /// </summary> /// <param name="node">Start fom this node.</param> private void RepairTree(AVLNode node) { AVLNode temp = node; //if (node == this.rootNode) //{ // return; //} while (temp.BalanceFactor <= 1 && temp.BalanceFactor >= -1) { if (temp.ParentNode != null) { this.RepairTree(temp.ParentNode); } return; } if (temp.BalanceFactor > 1) { if (temp.LeftNode.BalanceFactor > -1) { temp.RotateRight(this); RepairTree(temp); return; } temp.LeftNode.RotateLeft(this); temp.RotateRight(this); return; } if (temp.RightNode.BalanceFactor < 1) { temp.RotateLeft(this); return; } temp.RightNode.RotateRight(this); temp.RotateLeft(this); return; }
public void RotateLeft_FullTree() { var node = new AVLNode <int>(100); node.Left = new AVLNode <int>(50); node.Right = new AVLNode <int>(150); node.Left.Left = new AVLNode <int>(25); node.Left.Right = new AVLNode <int>(75); node.Right.Left = new AVLNode <int>(125); node.Right.Right = new AVLNode <int>(175); node = node.RotateLeft(); Assert.AreEqual <int>(150, node.Value); Assert.AreEqual <int>(175, node.Right.Value); Assert.AreEqual <int>(100, node.Left.Value); Assert.AreEqual <int>(125, node.Left.Right.Value); Assert.AreEqual <int>(50, node.Left.Left.Value); Assert.AreEqual <int>(25, node.Left.Left.Left.Value); Assert.AreEqual <int>(75, node.Left.Left.Right.Value); }
public void RotateLeft_FullTree() { var node = new AVLNode<int>(100); node.Left = new AVLNode<int>(50); node.Right = new AVLNode<int>(150); node.Left.Left = new AVLNode<int>(25); node.Left.Right = new AVLNode<int>(75); node.Right.Left = new AVLNode<int>(125); node.Right.Right = new AVLNode<int>(175); node = node.RotateLeft(); Assert.AreEqual<int>(150, node.Value); Assert.AreEqual<int>(175, node.Right.Value); Assert.AreEqual<int>(100, node.Left.Value); Assert.AreEqual<int>(125, node.Left.Right.Value); Assert.AreEqual<int>(50, node.Left.Left.Value); Assert.AreEqual<int>(25, node.Left.Left.Left.Value); Assert.AreEqual<int>(75, node.Left.Left.Right.Value); }
/// <summary> /// Removes the elemet from tree. /// </summary> /// <param name="item">Key Value pair of the elemet.</param> /// <returns>True if removed.</returns> public bool Remove(KeyValuePair <TKey, TValue> item) { AVLNode temp = this.rootNode; while (temp != null) { switch (item.Key.CompareTo(temp.NodeKey)) { case -1: temp = temp.LeftNode; break; case 1: temp = temp.RightNode; break; default: { if (temp.IsLeaf) { if (temp.ParentNode.LeftNode == temp) { temp.ParentNode.LeftNode = null; this.RepairTree(temp.ParentNode); nodeCount--; isModfied = true; return(true); } temp.ParentNode.RightNode = null; this.RepairTree(temp.ParentNode); nodeCount--; isModfied = true; return(true); } else if (temp.LeftNode == null) { temp.RightNode.ParentNode = temp.ParentNode; if (temp.ParentNode.LeftNode == temp) { temp.ParentNode.LeftNode = temp.RightNode; this.RepairTree(temp.ParentNode); nodeCount--; isModfied = true; return(true); } temp.ParentNode.RightNode = null; this.RepairTree(temp.ParentNode); nodeCount--; isModfied = true; return(true); } else if (temp.RightNode == null) { temp.LeftNode.ParentNode = temp.ParentNode; if (temp.ParentNode.LeftNode == temp) { temp.ParentNode.LeftNode = temp.LeftNode; this.RepairTree(temp.ParentNode); nodeCount--; isModfied = true; return(true); } temp.ParentNode.RightNode = null; this.RepairTree(temp.ParentNode); nodeCount--; isModfied = true; return(true); } else { temp.RotateLeft(this); temp.ParentNode.LeftNode = temp.LeftNode; temp.LeftNode.ParentNode = temp.ParentNode; this.RepairTree(temp.ParentNode); nodeCount--; isModfied = true; return(true); } } } } return(false); }