Пример #1
0
        public HeapNode <K, T> pop(int level, int offset)
        {
            bool right = offset > Math.Pow(2, level) / 2;

            switch (level)
            {
            case 0:
                return(this);

            case 1:
                if (right)
                {
                    HeapNode <K, T> tempNode = _rightChild;
                    _rightChild = null;
                    return(tempNode);
                }
                else
                {
                    HeapNode <K, T> tempNode = _leftChild;
                    _leftChild = null;
                    return(tempNode);
                }

            default:
                return(right ? _rightChild.pop(level - 1, offset - (int)Math.Pow(2, level - 1)) : _leftChild.pop(level - 1, offset));
            }
        }
Пример #2
0
        private void swap(HeapNode <K, T> node1, HeapNode <K, T> node2)
        {
            T tempElement = node1.Element;
            K tempKey     = node1.Key;

            node1.Element = node2.Element;
            node1.Key     = node2.Key;

            node2.Element = tempElement;
            node2.Key     = tempKey;
        }
        public T pop()
        {
            T element = _rootNode.Element;

            if (Level == 0)
            {
                _rootNode  = null;
                _nodeCount = 0;
                return(element);
            }

            HeapNode <K, T> lastNode = _rootNode.pop(Level, Offset);

            _rootNode.Element = lastNode.Element;
            _rootNode.Key     = lastNode.Key;

            //Decrement nodecount after pop() but before heapDown()
            _nodeCount--;

            heapDown();

            return(element);
        }
Пример #4
0
        //public methods
        public void push(K key, T element, int level, int offset)
        {
            bool right = offset > Math.Pow(2, level) / 2;

            switch (level)
            {
            case 0:
                _element = element;
                _key     = key;
                heapUp();
                break;

            case 1:
                if (right)
                {
                    _rightChild = new HeapNode <K, T>(this, _priority);
                    _rightChild.push(key, element, level - 1, offset - 1);
                }
                else
                {
                    _leftChild = new HeapNode <K, T>(this, _priority);
                    _leftChild.push(key, element, level - 1, offset);
                }
                break;

            default:
                if (right)
                {
                    _rightChild.push(key, element, level - 1, offset - (int)Math.Pow(2, level - 1));
                }
                else
                {
                    _leftChild.push(key, element, level - 1, offset);
                }
                break;
            }
        }
 //constructor
 public HeapTreeImplementation(HeapPriorityType priorityType)
 {
     _nodeCount    = 0;
     _priorityType = priorityType;
     _rootNode     = new HeapNode <K, T>(null, priorityType);
 }
Пример #6
0
 //constructor
 public HeapNode(HeapNode <K, T> parent, HeapPriorityType priority)
 {
     _parent   = parent;
     _priority = priority;
 }