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; }
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.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.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.HeapifyDownMin(nodoActual.HijoDer); } }
void HeapifyDownMax(NodoHeap <T3> nodoActual) { if (nodoActual.HijoIzq != null && nodoActual.HijoDer != null) { NodoHeap <T3> mayor = null; if (nodoActual.HijoIzq.Prioridad >= nodoActual.HijoDer.Prioridad) { mayor = nodoActual.HijoIzq; } else if (nodoActual.HijoIzq.Prioridad < nodoActual.HijoDer.Prioridad) { mayor = nodoActual.HijoDer; } if (mayor != null && nodoActual.Prioridad < mayor.Prioridad) { T3 tempVal = nodoActual.Valor; int tempPrior = nodoActual.Prioridad; nodoActual.Valor = mayor.Valor; nodoActual.Prioridad = mayor.Prioridad; mayor.Prioridad = tempPrior; mayor.Valor = tempVal; this.HeapifyDownMax(mayor); } } else if (nodoActual.HijoIzq != null && nodoActual.Prioridad < nodoActual.HijoIzq.Prioridad) { T3 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.HeapifyDownMax(nodoActual.HijoIzq); } else if (nodoActual.HijoDer != null && nodoActual.Prioridad < nodoActual.HijoDer.Prioridad) { T3 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.HeapifyDownMax(nodoActual.HijoDer); } }
void HeapifyUpMax(NodoHeap <T3> nodoActual) { if (nodoActual.Padre != null && nodoActual.Prioridad > nodoActual.Padre.Prioridad) { T3 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.HeapifyUpMax(nodoActual.Padre); } }
void ShowTree(NodoHeap <T3> 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); } }
public NodoHeap <T3> SuprimeMin() { NodoHeap <T3> temp = new NodoHeap <T3>(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.HeapifyDownMax(this.lista[0]); return(temp); }
public void Inserta(T3 valor, int prioridad) { NodoHeap <T3> temp = new NodoHeap <T3>(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.HeapifyUpMax(temp); }