/// <summary> /// Removes and returns the element with highest priority, i.e. lowest key. /// </summary> public KeyValuePair <long, T> Dequeue() { if (_root == null) { throw new InvalidOperationException("priority queue is empty!"); } PQItem cur = _root; PQItem parent = null; while (cur.Children[0] != null) { parent = cur; cur = cur.Children[0]; } if (parent == null) { _root = cur.Children[1]; } else { parent.Children[0] = cur.Children[1]; } return(new KeyValuePair <long, T>(cur.Key, cur.Value)); }
private void Enqueue(PQItem item, PQItem root) { Contract.Requires <ArgumentNullException>(item != null); Contract.Requires <ArgumentNullException>(root != null); if (item.Key == root.Key) { root.Value = Resolve(root.Value, item.Value); } else if (item.Key < root.Key) { if (root.Children[0] == null) { root.Children[0] = item; } else { Enqueue(item, root.Children[0]); } } else { if (root.Children[1] == null) { root.Children[1] = item; } else { Enqueue(item, root.Children[1]); } } }
/// <summary> /// Inserts element <paramref name="value"/> for specified <paramref name="key"/>. Lower key means higher priority. /// </summary> /// <param name="key">key for which to insert the value</param> /// <param name="value">element to insert</param> public void Enqueue(long key, T value) { PQItem pqi = new PriorityQueue <T> .PQItem(key, value); if (_root == null) { _root = pqi; } else { Enqueue(pqi, _root); } }