Entrenamiento de algoritmos del día 19 en 'Code Thinking'|235. Ancestro común más cercano en árbol de búsqueda binaria; 701. Inserción en árbol de búsqueda binaria; 450. Eliminación de nodo en árbol de búsqueda binaria

Encuentra el ancestro común más cercano en un árbol de búsqueda binaria.

Anfoque recursivo


struct NodoArbol {
    int valor;
    NodoArbol* izquierda;
    NodoArbol* derecha;
    NodoArbol(int x) : valor(x), izquierda(nullptr), derecha(nullptr) {}
};

NodoArbol* encontrarAncestro(NodoArbol* raiz, NodoArbol* nodo1, NodoArbol* nodo2) {
    if (!raiz) return nullptr;
    
    if (nodo1->valor < raiz->valor && nodo2->valor < raiz->valor) {
        NodoArbol* resultado = encontrarAncestro(raiz->izquierda, nodo1, nodo2);
        if (resultado) return resultado;
    }
    
    if (nodo1->valor > raiz->valor && nodo2->valor > raiz->valor) {
        NodoArbol* resultado = encontrarAncestro(raiz->derecha, nodo1, nodo2);
        if (resultado) return resultado;
    }
    
    return raiz;
}

Enfoque iterativo


NodoArbol* encontrarAncestroIterativo(NodoArbol* raiz, NodoArbol* nodo1, NodoArbol* nodo2) {
    while (raiz) {
        if (raiz->valor > nodo1->valor && raiz->valor > nodo2->valor) {
            raiz = raiz->izquierda;
        } else if (raiz->valor < nodo1->valor && raiz->valor < nodo2->valor) {
            raiz = raiz->derecha;
        } else {
            return raiz;
        }
    }
    return nullptr;
}

LeetCode 701

Inserción en árbol de búsqueda binaria.

Enfoque recursivo


struct NodoArbol {
    int valor;
    NodoArbol* izquierda;
    NodoArbol* derecha;
    NodoArbol(int x) : valor(x), izquierda(nullptr), derecha(nullptr) {}
};

NodoArbol* insertar(NodoArbol* raiz, int valor) {
    if (!raiz) {
        return new NodoArbol(valor);
    }
    
    if (valor < raiz->valor) {
        raiz->izquierda = insertar(raiz->izquierda, valor);
    } else {
        raiz->derecha = insertar(raiz->derecha, valor);
    }
    
    return raiz;
}

Enfoque iterativo


NodoArbol* insertarIterativo(NodoArbol* raiz, int valor) {
    if (!raiz) {
        return new NodoArbol(valor);
    }
    
    NodoArbol* actual = raiz;
    NodoArbol* padre = nullptr;
    
    while (actual) {
        padre = actual;
        if (valor < actual->valor) {
            actual = actual->izquierda;
        } else {
            actual = actual->derecha;
        }
    }
    
    if (valor < padre->valor) {
        padre->izquierda = new NodoArbol(valor);
    } else {
        padre->derecha = new NodoArbol(valor);
    }
    
    return raiz;
}

LeetCode 450

Eliminación de nodo en árbol de búsqueda binaria.

Implementación


struct NodoArbol {
    int valor;
    NodoArbol* izquierda;
    NodoArbol* derecha;
    NodoArbol(int x) : valor(x), izquierda(nullptr), derecha(nullptr) {}
};

NodoArbol* eliminar(NodoArbol* raiz, int clave) {
    if (!raiz) return nullptr;
    
    if (raiz->valor == clave) {
        if (!raiz->izquierda && !raiz->derecha) {
            delete raiz;
            return nullptr;
        }
        
        if (!raiz->izquierda) {
            NodoArbol* temp = raiz->derecha;
            delete raiz;
            return temp;
        }
        
        if (!raiz->derecha) {
            NodoArbol* temp = raiz->izquierda;
            delete raiz;
            return temp;
        }
        
        NodoArbol* minimo = encontrarMinimo(raiz->derecha);
        raiz->valor = minimo->valor;
        raiz->derecha = eliminar(raiz->derecha, minimo->valor);
    } else if (clave < raiz->valor) {
        raiz->izquierda = eliminar(raiz->izquierda, clave);
    } else {
        raiz->derecha = eliminar(raiz->derecha, clave);
    }
    
    return raiz;
}

NodoArbol* encontrarMinimo(NodoArbol* nodo) {
    while (nodo->izquierda) {
        nodo = nodo->izquierda;
    }
    return nodo;
}

Etiquetas: binary-search-tree tree-traversal data-structures algorithms c-plus-plus

Publicado el 9-1 15:00