0

Necesito hacer una función reemplazar(nodo arbol, nodo arbol_nuevo) que reemplace arbol por arbol_nuevo.

Pero la estructura arbol no tiene un elemento para guardar cual es su padre.

La estructura es así:

struct ABB {

   int elem;
   ABB *left, *right;

};

typedef ABB *arbol;

Alguna idea de como encararlo?

EnMiPcFunciona
  • 165
  • 1
  • 16
  • Tienes que saber qué nodo necesitas reemplazar mirando en el padre. El padre conoce a sus dos hijos y, si necesitas cambiar uno de ellos entonces ya tendrás todo lo que necesitas... nodo del padre y nodos hijos del nodo a reemplazar – eferion Apr 11 '18 at 06:47
  • Debo necesariamente cambiar o bien la estructura arbol agregando un campo "padre" o que la funcion eliminar reciba como parametro al padre. Pensé que podría haber otra solución. – EnMiPcFunciona Apr 11 '18 at 19:36

1 Answers1

0

Los nodos no son árboles.

He visto en StackOverflow en Español varias veces esta confusión, y me resulta muy curioso que tantos usuarios cometan ese error.

En el código que has facilitado estás haciendo un alias de puntero a nodo llamado arbol. Y eso es tan erróneo como decir que un escalón es una escalera, sinceramente ¿Te parecen lo mismo?:

Necesito hacer una función [...] que reemplace arbol por arbol_nuevo.

Crea un objeto de tipo arbol:

class arbol {
    ABB *raiz { nullptr };
}

Ahora podrás crear una una función de reemplazo, que hará un simple intercambio de punteros:

class arbol {
    ABB *raiz { nullptr };
public:
    void reemplazo(arbol &a) {
        std::swap(raiz, a.raiz);
    }
};
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Entiendo lo de que un nodo no es una estructura. Y lo del codigo, lo que estoy buscando es crear yo mismo esa función reemplazar sin usar "swap" ni clases. Gracias igualmente. – EnMiPcFunciona Apr 11 '18 at 18:45
  • @Edu aclara tu pregunta, porque no queda claro qué es lo que necesitas. – PaperBirdMaster Apr 12 '18 at 08:29
  • fijate si podes lo que le comente a eferion – EnMiPcFunciona Apr 12 '18 at 21:24
  • Si quiero eliminar un nodo de una estructura de árbol binario de busqueda, mi pregunta es ¿necesito si o si que la estructura árbol tenga un campo "padre" para poder hacer la eliminación o puedo hacer algo con recursividad para que no necesite posicionarme en el padre para hacer la eliminación junto al reemplazo necesario para mantener la cualidad de árbol binario de busqueda? – EnMiPcFunciona Apr 15 '18 at 19:21
  • Sigue sin estar clara tu pregunta @Edu si quieres reemplazo no necesitas eliminar; si necesitas eliminar no parece que estés hablando de reemplazos. – PaperBirdMaster Apr 16 '18 at 05:19
  • Bueno, es que sabiendo como reemplazar sabría como hacer lo de eliminar nodos. Pero lo que me interesa realmente es eliminar nodos. ¿Me puedes ayudar a entender como eliminar un nodo de un arbol de busqueda binaria de manera recursiva y de manera eficiente (que no vuelva a recorrer el árbol desde su raíz principal)? gracias igualmente por otras cosas que me has ayudado en otros hilos. – EnMiPcFunciona Apr 16 '18 at 22:52