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); }