示例#1
0
 // 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);
 }
示例#2
0
        // 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));
        }