// Method srch translated from 352.srch.c of Gonnet & Baeza-Yates public static KDNode <T> Search <T>(HPoint key, KDNode <T> t, int K) { for (int lev = 0; t != null; lev = (lev + 1) % K) { if (!t.deleted && key.Equals(t.key)) { return(t); } else if (key.Coord[lev] > t.key.Coord[lev]) { t = t.right; } else { t = t.left; } } return(null); }
// Method ins translated from 352.ins.c of Gonnet & Baeza-Yates public static int Edit <T>(HPoint key, IEditor <T> editor, KDNode <T> t, int lev, int k) { KDNode <T> next_node; int nextLev = (lev + 1) % k; lock (t) { if (key.Equals(t.key)) { bool wasDeleted = t.deleted; t.value = editor.Edit(t.deleted ? default(T) : t.value); t.deleted = (t.value == null); if (t.deleted == wasDeleted) { return(0); } else if (wasDeleted) { return(-1); } return(1); } else if (key.Coord[lev] > t.key.Coord[lev]) { next_node = t.right; if (next_node == null) { t.right = Create(key, editor); return(t.right.deleted ? 0 : 1); } } else { next_node = t.left; if (next_node == null) { t.left = Create(key, editor); return(t.left.deleted ? 0 : 1); } } } return(Edit(key, editor, next_node, nextLev, k)); }