AvlBinaryTreeNode <T> Remove(AvlBinaryTreeNode <T> node, T key) // удаление ключа key из дерева node { if (node == null) { return(null); } var comp = comparer.Compare(key, node.Key); if (comp < 0) { node.Left = Remove(node.Left, key); } else if (comp > 0) { node.Right = Remove(node.Right, key); } else // k == p->key { var left = node.Left; var right = node.Right; wasRemoved = true; //delete p; if (right == null) { return(left); } var min = FindMin(right); min.Right = RemoveMin(right); min.Left = left; return(Balance(min)); } return(Balance(node)); }
void FixHeight(AvlBinaryTreeNode <T> node) { var heightLeft = GetHeight(node.Left); var heightRight = GetHeight(node.Right); node.Height = heightLeft > heightRight ? heightLeft : heightRight; node.Height += 1; }
// private methods... byte GetHeight(AvlBinaryTreeNode <T> node) { if (node != null) { return(node.Height); } return(0); }
// public methods... public void Add(T item) { wasInserted = false; root = Insert(root, item); if (wasInserted) { count++; } }
AvlBinaryTreeNode <T> RemoveMin(AvlBinaryTreeNode <T> node) // удаление узла с минимальным ключом из дерева node { if (node.Left == null) { return(node.Right); } node.Left = RemoveMin(node.Left); return(Balance(node)); }
AvlBinaryTreeNode <T> RotateLeft(AvlBinaryTreeNode <T> node) // левый поворот { var temp = node.Right; node.Right = temp.Left; temp.Left = node; FixHeight(node); FixHeight(temp); return(temp); }
public bool Remove(T item) { wasRemoved = false; root = Remove(root, item); if (wasRemoved) { count--; } return(wasRemoved); }
AvlBinaryTreeNode <T> FindNode(AvlBinaryTreeNode <T> rootNode, T key) { if (rootNode == null) { return(null); } var comp = comparer.Compare(key, rootNode.Key); if (comp == 0) { return(rootNode); } if (comp < 0) { return(FindNode(rootNode.Left, key)); } return(FindNode(rootNode.Right, key)); }
AvlBinaryTreeNode <T> Balance(AvlBinaryTreeNode <T> node) { FixHeight(node); if (BalanceFactor(node) == 2) { if (BalanceFactor(node.Right) < 0) { node.Right = RotateRight(node.Right); } return(RotateLeft(node)); } if (BalanceFactor(node) == -2) { if (BalanceFactor(node.Left) > 0) { node.Left = RotateLeft(node.Left); } return(RotateRight(node)); } return(node); // балансировка не нужна }
AvlBinaryTreeNode <T> Insert(AvlBinaryTreeNode <T> root, T key) // вставка ключа k в дерево с корнем root { if (root == null) { wasInserted = true; return(new AvlBinaryTreeNode <T>(key)); } var comp = comparer.Compare(key, root.Key); if (comp < 0 /*k < p->key*/) { root.Left = Insert(root.Left, key); } else if (comp > 0) { root.Right = Insert(root.Right, key); } else { return(root); } return(Balance(root)); }
int BalanceFactor(AvlBinaryTreeNode <T> node) { return(GetHeight(node.Right) - GetHeight(node.Left)); }
public void Clear() { root = null; count = 0; }
AvlBinaryTreeNode <T> FindMin(AvlBinaryTreeNode <T> node) // поиск узла с минимальным ключом в дереве node { return(node.Left != null?FindMin(node.Left) : node); }