public void Delete(T value) { AVLNode <T> current = Find(value); if (current.ChildCount == 0) { if (current.IsLeftChild) { current.Parent.left = null; RecursiveBalacing(current.Parent); } else if (current.IsRightChild) { current.Parent.right = null; //current = null; RecursiveBalacing(current.Parent); } else if (current == root) { root = null; } } else if (current.ChildCount == 2) { AVLNode <T> candidate = Maximum(current.left); current.Value = candidate.Value; if (candidate.Parent != current) { candidate.Parent.right = candidate.left; RecursiveBalacing(candidate.Parent); } if (current != root) { current.Parent = candidate.Parent; candidate.Parent.left = candidate; current.left = candidate.left; candidate.left = null; } } else if (current.ChildCount == 1) { AVLNode <T> child = current.left == null ? current.right : current.left; if (current.IsLeftChild) { current.Parent.left = child; // current = null; RecursiveBalacing(current.Parent); } else if (current.IsRightChild) { current.Parent.right = child; // current = null; RecursiveBalacing(current.Parent); } else if (current == root) { // current = null; root = child; RecursiveBalacing(root); } } }