public void Enqueue(PriorityQueueNode <TData> node, int priority) { if (_currentIndex >= nodes.Length) { throw new InvalidOperationException("The heap has reached its maximum capacity. Cannot enqueue further nodes."); } if (priority < 0) { throw new ArgumentOutOfRangeException("Priority cannot be less than 0!"); } // Place the new element in the next available position in the array node.index = _currentIndex; node.priority = priority; nodes[_currentIndex] = node; // Compare the new element with its parent - if smaller, then swap with parent PriorityQueueNode <TData> parent; while ((parent = GetParent(node)) != null && parent.priority > node.priority) { Swap(node, parent); } _currentIndex++; _nodeCount++; }
public PriorityQueueNode <TData> GetParent(PriorityQueueNode <TData> node) { if (node.index < 2) { return(null); } return(nodes[node.index / 2]); }
public void Swap(PriorityQueueNode <TData> first, PriorityQueueNode <TData> second) { int temp = first.index; first.index = second.index; second.index = temp; nodes[first.index] = first; nodes[second.index] = second; }
public PriorityQueueNode <TData> GetRight(PriorityQueueNode <TData> node) { int index = 2 * node.index + 1; if (index >= maxNodes) { return(null); } return(nodes[index]); }
public PriorityQueueNode <TData> Dequeue() { if (IsEmpty()) { return(null); } PriorityQueueNode <TData> dequeuedNode = nodes[1]; PriorityQueueNode <TData> swapperNode = nodes[_currentIndex - 1]; nodes[1] = swapperNode; nodes[_currentIndex - 1] = null; swapperNode.index = 1; PriorityQueueNode <TData> left = GetLeft(swapperNode); PriorityQueueNode <TData> right = GetRight(swapperNode); while ((left != null && swapperNode.priority > left.priority) || (right != null && swapperNode.priority > right.priority)) { if (left == null) { Swap(swapperNode, right); } else if (right == null) { Swap(swapperNode, left); } else { if (left.priority <= right.priority) { Swap(swapperNode, left); } else { Swap(swapperNode, right); } } left = GetLeft(swapperNode); right = GetRight(swapperNode); } _currentIndex--; _nodeCount--; return(dequeuedNode); }
public void Remove(PriorityQueueNode <TData> node) { if (nodes[node.index] != node) { throw new InvalidOperationException("The node being removed has already been removed (index mismatch)."); } PriorityQueueNode <TData> swapperNode = nodes[_currentIndex - 1]; nodes[node.index] = swapperNode; nodes[_currentIndex - 1] = null; swapperNode.index = node.index; PriorityQueueNode <TData> left = GetLeft(swapperNode); PriorityQueueNode <TData> right = GetRight(swapperNode); while ((left != null && swapperNode.priority > left.priority) || (right != null && swapperNode.priority > right.priority)) { if (left == null) { Swap(swapperNode, right); } else if (right == null) { Swap(swapperNode, left); } else { if (left.priority <= right.priority) { Swap(swapperNode, left); } else { Swap(swapperNode, right); } } left = GetLeft(swapperNode); right = GetRight(swapperNode); } _currentIndex--; _nodeCount--; }
public bool Contains(PriorityQueueNode <TData> node) { if (nodes[node.index] == node) { return(true); } else { for (int i = 0; i < _currentIndex; i++) { if (nodes[i] == node) { return(true); } } } return(false); }
public void UpdatePriority(PriorityQueueNode <TData> node, int priority) { Remove(node); Enqueue(node, priority); }