コード例 #1
0
 public NodoHeap(T2 valor, int prioridad, NodoHeap <T2> hijoIzq, NodoHeap <T2> hijoDer, NodoHeap <T2> padre = null)
 {
     this.Valor     = valor;
     this.HijoIzq   = hijoIzq;
     this.HijoDer   = hijoDer;
     this.Padre     = padre;
     this.Prioridad = prioridad;
 }
コード例 #2
0
            void ShowTree(NodoHeap <T1> nodoActual, int llamado)
            {
                for (int veces = 0; veces < llamado; veces++)
                {
                    Console.Write("-");
                }
                Console.Write(nodoActual.Valor + " " + nodoActual.Prioridad);
                Console.WriteLine();

                if (nodoActual.HijoIzq != null)
                {
                    this.ShowTree(nodoActual.HijoIzq, llamado + 1);
                }
                if (nodoActual.HijoDer != null)
                {
                    this.ShowTree(nodoActual.HijoDer, llamado + 1);
                }
            }
コード例 #3
0
            void HeapifyUpMin(NodoHeap <T1> nodoActual)
            {
                if (nodoActual.Padre != null && nodoActual.Padre.Prioridad > nodoActual.Prioridad)
                {
                    T1  tempValor     = nodoActual.Valor;
                    int tempPrioridad = nodoActual.Prioridad;

                    nodoActual.Valor     = nodoActual.Padre.Valor;
                    nodoActual.Prioridad = nodoActual.Padre.Prioridad;

                    nodoActual.Padre.Valor     = tempValor;
                    nodoActual.Padre.Prioridad = tempPrioridad;

                    this.pila.Push(nodoActual);

                    this.HeapifyUpMin(nodoActual.Padre);
                }
                this.pila.Push(nodoActual);
            }
コード例 #4
0
            public NodoHeap <T1> SuprimeMin()
            {
                NodoHeap <T1> temp = new NodoHeap <T1>(this.lista[0].Valor, this.lista[0].Prioridad, null, null);

                this.lista[0].Valor     = this.lista[this.lista.Count - 1].Valor;
                this.lista[0].Prioridad = this.lista[this.lista.Count - 1].Prioridad;

                if ((this.lista.Count - 1) % 2 != 0)
                {
                    this.lista[this.lista.Count - 1].Padre.HijoIzq = null;
                }
                else
                {
                    this.lista[this.lista.Count - 1].Padre.HijoDer = null;
                }

                this.lista.RemoveAt(this.lista.Count - 1);

                this.HeapifyDownMin(this.lista[0]);

                return(temp);
            }
コード例 #5
0
            public void Inserta(T1 valor, int prioridad)
            {
                NodoHeap <T1> temp = new NodoHeap <T1>(valor, prioridad, null, null);

                if (this.lista.Count == 0)
                {
                    this.lista.Add(temp); return;
                }

                temp.Padre = this.lista[(this.lista.Count - 1) / 2];

                if (this.lista.Count % 2 != 0)
                {
                    temp.Padre.HijoIzq = temp;
                }
                else
                {
                    temp.Padre.HijoDer = temp;
                }
                this.lista.Add(temp);

                // this.HeapifyUpMin(temp);
            }
コード例 #6
0
            void HeapifyDownMin(NodoHeap <T1> nodoActual)
            {
                if (nodoActual.HijoIzq != null && nodoActual.HijoDer != null)
                {
                    NodoHeap <T1> menor = null;

                    if (nodoActual.HijoIzq.Prioridad <= nodoActual.HijoDer.Prioridad)
                    {
                        menor = nodoActual.HijoIzq;
                    }
                    else if (nodoActual.HijoIzq.Prioridad > nodoActual.HijoDer.Prioridad)
                    {
                        menor = nodoActual.HijoDer;
                    }
                    if (menor != null && nodoActual.Prioridad > menor.Prioridad)
                    {
                        T1  tempVal   = nodoActual.Valor;
                        int tempPrior = nodoActual.Prioridad;

                        nodoActual.Valor     = menor.Valor;
                        nodoActual.Prioridad = menor.Prioridad;

                        menor.Prioridad = tempPrior;
                        menor.Valor     = tempVal;

                        this.pila.Push(nodoActual);

                        this.HeapifyDownMin(menor);
                    }
                }
                else if (nodoActual.HijoIzq != null && nodoActual.Prioridad > nodoActual.HijoIzq.Prioridad)
                {
                    T1  tempVal   = nodoActual.Valor;
                    int tempPrior = nodoActual.Prioridad;

                    nodoActual.Valor     = nodoActual.HijoIzq.Valor;
                    nodoActual.Prioridad = nodoActual.HijoIzq.Prioridad;

                    nodoActual.HijoIzq.Prioridad = tempPrior;
                    nodoActual.HijoIzq.Valor     = tempVal;

                    this.pila.Push(nodoActual);

                    this.HeapifyDownMin(nodoActual.HijoIzq);
                }
                else if (nodoActual.HijoDer != null && nodoActual.Prioridad > nodoActual.HijoDer.Prioridad)
                {
                    T1  tempVal   = nodoActual.Valor;
                    int tempPrior = nodoActual.Prioridad;

                    nodoActual.Valor     = nodoActual.HijoDer.Valor;
                    nodoActual.Prioridad = nodoActual.HijoDer.Prioridad;

                    nodoActual.HijoDer.Prioridad = tempPrior;
                    nodoActual.HijoDer.Valor     = tempVal;

                    this.pila.Push(nodoActual);

                    this.HeapifyDownMin(nodoActual.HijoDer);
                }
                this.pila.Push(nodoActual);
            }