/// <summary> /// Inserts a /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <param name="t"></param> /// <param name="lev"></param> /// <param name="k"></param> /// <returns></returns> /// <remarks> Method ins translated from 352.ins.c of Gonnet and Baeza-Yates</remarks> public static KdNode Insert(HPoint key, object value, KdNode t, int lev, int k) { if (t == null) { t = new KdNode(key, value); } else if (key.Equals(t.K)) { // "re-insert" if (t.IsDeleted) { t.IsDeleted = false; t.V = value; } else { throw (new KeyDuplicateException()); } } else if (key[lev] > t.K[lev]) { t.Right = Insert(key, value, t.Right, (lev + 1) % k, k); } else { t.Left = Insert(key, value, t.Left, (lev + 1) % k, k); } return(t); }
/// <summary> /// Searches for a specific value /// </summary> /// <param name="key"></param> /// <param name="t"></param> /// <param name="k"></param> /// <returns></returns> /// <remarks>Method srch translated from 352.srch.c of Gonnet and Baeza-Yates</remarks> public static KdNode Search(HPoint key, KdNode t, int k) { for (int lev = 0; t != null; lev = (lev + 1) % k) { if (!t.IsDeleted && key.Equals(t.K)) { return(t); } t = key[lev] > t.K[lev] ? t.Right : t.Left; } return(null); }
/// <summary> /// Searches for a specific value /// </summary> /// <param name="key"></param> /// <param name="t"></param> /// <param name="k"></param> /// <returns></returns> /// <remarks>Method srch translated from 352.srch.c of Gonnet and Baeza-Yates</remarks> public static KdNode Search(HPoint key, KdNode t, int k) { for (int lev = 0; t != null; lev = (lev + 1) % k) { if (!t.IsDeleted && key.Equals(t.K)) { return t; } t = key[lev] > t.K[lev] ? t.Right : t.Left; } return null; }
/// <summary> /// Inserts a /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <param name="t"></param> /// <param name="lev"></param> /// <param name="k"></param> /// <returns></returns> /// <remarks> Method ins translated from 352.ins.c of Gonnet and Baeza-Yates</remarks> public static KdNode Insert(HPoint key, object value, KdNode t, int lev, int k) { if (t == null) { t = new KdNode(key, value); } else if (key.Equals(t.K)) { // "re-insert" if (t.IsDeleted) { t.IsDeleted = false; t.V = value; } else { throw (new KeyDuplicateException()); } } else if (key[lev] > t.K[lev]) { t.Right = Insert(key, value, t.Right, (lev + 1) % k, k); } else { t.Left = Insert(key, value, t.Left, (lev + 1) % k, k); } return t; }