// ---------------------------------------------------------------------------- public void Agregar(object pElem) { if (Raiz == null) { Raiz = pElem; } else if (pElem.ToString().CompareTo(Raiz.ToString()) < 0) { if (SubArbolIzq == null) { SubArbolIzq = new CArbolBB(pElem); } else { SubArbolIzq.Agregar(pElem); } } else // pElem.ToString().CompareTo(arbol.Raiz.ToString()) > 0 { if (SubArbolDer == null) { SubArbolDer = new CArbolBB(pElem); } else { SubArbolDer.Agregar(pElem); } } }
// ---------------------------------------------------------------------------- public object Minimo() { if (EsVacio()) { return(null); } else { return(SubArbolIzq == null ? Raiz : SubArbolIzq.Minimo()); } }
// ---------------------------------------------------------------------------- public int Altura() { if (EsVacio()) { return(0); } else { int AlturaIzq = (SubArbolIzq == null ? 0 : 1 + SubArbolIzq.Altura()); int AlturaDer = (SubArbolDer == null ? 0 : 1 + SubArbolDer.Altura()); return(AlturaIzq > AlturaDer ? AlturaIzq : AlturaDer); } }
// ---------------------------------------------------------------------------- public void PostOrden() { if (Raiz != null) { // ----- Procesar hijo Izq if (SubArbolIzq != null) { SubArbolIzq.PostOrden(); } // ----- Procesar hijo Der if (SubArbolDer != null) { SubArbolDer.PostOrden(); } // ----- Procesar la raiz Console.WriteLine(Raiz.ToString()); } }
// ---------------------------------------------------------------------------- public CArbolBB Padre(object pRaiz) { if (EsVacio()) { return(null); } else if (EsHijo(pRaiz)) { return(this); } else if (pRaiz.ToString().CompareTo(Raiz.ToString()) < 0) { return(SubArbolIzq != null?SubArbolIzq.Padre(pRaiz) : null); } else { return(SubArbolDer != null?SubArbolDer.Padre(pRaiz) : null); } }
// ---------------------------------------------------------------------------- public CArbolBB SubArbol(object pRaiz) { if (EsVacio()) { return(null); } else if (Raiz.Equals(pRaiz)) { return(this); } else if (pRaiz.ToString().CompareTo(Raiz.ToString()) < 0) { return(SubArbolIzq != null?SubArbolIzq.SubArbol(pRaiz) : null); } else { return(SubArbolDer != null?SubArbolDer.SubArbol(pRaiz) : null); } }
// ---------------------------------------------------------------------------- public virtual void Eliminar(Object pRaiz) { if (EsVacio()) { Console.WriteLine("ERROR. Elemento no encontrado..."); } else { // ----- Verificar si la raiz es el elemento que se desea eliminar if (pRaiz.Equals(Raiz)) { // Si no tiene hijos, eliminar la raiz o una hoja if (SubArbolIzq == null && SubArbolDer == null) { Raiz = null; } else // árbol tiene por lo menos un hijo if (SubArbolIzq == null) // ----- Solo tiene hijo derecho { Raiz = SubArbolDer.Raiz; SubArbolIzq = SubArbolDer.SubArbolIzq; SubArbolDer = SubArbolDer.SubArbolDer; } else if (SubArbolDer == null) // ----- Solo tiene hijo izquierdo { Raiz = SubArbolIzq.Raiz; SubArbolDer = SubArbolIzq.SubArbolDer; SubArbolIzq = SubArbolIzq.SubArbolIzq; } else // Tiene ambos hijos { Raiz = SubArbolDer.Minimo(); SubArbolDer.Eliminar(Raiz); } } else // ----- Verificar si el elemento a eliminar esta en el hijo Izq if (pRaiz.ToString().CompareTo(Raiz.ToString()) < 0) { if (SubArbolIzq != null) { SubArbolIzq.Eliminar(pRaiz); } } else // ----- Elemento a eliminar esta en el hijo Der if (SubArbolDer != null) { SubArbolDer.Eliminar(pRaiz); } // Verificar si los hijos son hojas vacias if (SubArbolIzq != null && SubArbolIzq.EsVacio()) { SubArbolIzq = null; } if (SubArbolDer != null && SubArbolDer.EsVacio()) { SubArbolDer = null; } } }