private static void TraverseInorder <T>(AvlTree <T> .Node node, CollectDelegate <T> collect)
 {
     collect(node.value);
     if (node.left != null)
     {
         TraverseInorder(node.left, collect);
     }
     if (node.right != null)
     {
         TraverseInorder(node.right, collect);
     }
 }
        private static void RangeQuery <T>(AvlTree <T> .Node node, CollectDelegate <T> collect, QueryDelegate <T> traverseLeft, QueryDelegate <T> traverseRight)
        {
            int cmpLeft = traverseLeft(node.value);

            if (cmpLeft > 0 && node.left != null)
            {
                RangeQuery(node.left, collect, traverseLeft, traverseRight);
            }

            int cmpRight = traverseRight(node.value);

            if (cmpLeft > 0 && cmpRight > 0)
            {
                collect(node.value);
            }

            if (cmpRight > 0 && node.right != null)
            {
                RangeQuery(node.right, collect, traverseLeft, traverseRight);
            }
        }
 public static void MapRange <T>(this AvlTree <T> tree, T minValue, T maxValue, CollectDelegate <T> collect)
 {
     RangeQuery(tree.root, collect, x => tree.compare(x, minValue), x => tree.compare(maxValue, x));
 }
 public static void Map <T>(this AvlTree <T> tree, TraversalDelegate <T> traversalmethod, CollectDelegate <T> collect)
 {
     traversalmethod(tree.root, collect);
 }