[Top-Down] Práctico 3, Ej. 7 (Profundidad de un árbol binario).

[Top-Down] Práctico 3, Ej. 7 (Profundidad de un árbol binario).

de Pablo Martin Baez Echevarria -
Número de respuestas: 1

Hola,

Quería saber si he resuelto bien este ejercicio, y tengo duda en el apartado C).

A)

short profundidad(nodo *arbol) {

    short hizq = -1, hder = -1;

    if(arbol->izquierdo != null)

        hizq = profundidad(arbol->izquierdo);

    if(arbol->derecho != null)

        hder = profundidad(arbol->derecho);

    if(hizq <= hder) {

        return 1 + hder;

    } else {

        return 1 + hizq;

    }

}

B) Ahora paso a compilar la rutina anterior:

null equ 0


busco_profundidad proc


push bp ; guardo contexto

mov bp, sp


push ax ; guardo contexto

push bx

push cx

push dx

push es


mov dx, [bp+6] ; dx = sgto. arbol

mov bx, [bp+4] ; bx = desp. arbol

mov es, dx     ; es:[bx] = sgto. izquierdo

                      ; es:[bx+2] = desp. izquierdo

                      ; es:[bx+4] = sgto. derecho

                      ; es:[bx+6] = desp. derecho

                      ; es:[bx+8] = numero


mov ax, -1     ; hizq

mov cx, -1     ; hder


test_subizq:

mov dx, es:[bx]

or dx, es:[bx+2]

cmp dx, null

je test_subder

push word ptr es:[bx]

push word ptr es:[bx+2]

call busco_profundidad

pop ax ; resultado de hizq


test_subder:

mov dx, es:[bx+4]

or dx, es:[bx+6]

cmp dx, null

je if

push word ptr es:[bx+4]

push word ptr es:[bx+6]

call busco_profundidad

pop cx ; resultado de hder


if:

cmp ax, cx

jg else

mov dx, cx

jmp fin

else:

mov dx, ax


fin:

inc dx               ; incremento el resultado en 1

mov [bp+6], dx ; pongo el resultado en el lugar del primer parametro 

mov dx, [bp+2]

mov [bp+4], dx ; subo la direccion de retorno un lugar en el stack, sobreescribiendo el segundo parametro


pop es    ; restauro contexto

pop dx

pop cx

pop bx

pop ax

pop bp

add sp, 2 ; subo el stack pointer para que quede apuntando a la direccion de retorno

ret


busco_profundidad endp


Tengo algunas dudas:

1-¿Está bien que los punteros se mapeen a assembler como dos palabras (segmento y desplazamiento)? Como el parámetro que le pasan a profundidad() es de tipo nodo* (puntero a nodo) y eso en la invocación de busco_profundidad se compiló como el pasaje de dos parámetros (segmento_arbol y offset_arbol), supuse que lo mismo debía ser para nodo* izquierdo y nodo* derecho. 

2-Bajo la interpretación de que un puntero se compila como segmento y desplazamiento, la condición de que sea nulo, ¿equivale a que ambos desplazamiento y segmento sean nulos? Es lo que asumí en mi solución. Lo que hice fue un OR del segmento con el desplazamiento, y el resultado lo comparé con null. Si es distinto de null, es que al menos uno de los dos tiene algún bit en 1. ¿Es correcto?

3-Cuando pusheo los parámetros para calcular la altura del subárbol izquierdo y derecho, lo hago leyendo directo de memoria. ¿Es necesario poner word ptr?

C)

¿Aquí hay que plantear una recurrencia, no? ¿Cómo sería en este caso?


Saludos,

Pablo.

En respuesta a Pablo Martin Baez Echevarria

Re: [Top-Down] Práctico 3, Ej. 7 (Profundidad de un árbol binario).

de Gustavo Brown -

1) Es correcto. Un detalle de tu solución es que si lo llamo con el puntero nulo va a fallar. Y consideraste que un árbol de un solo nodo (solo la raíz) tiene altura 0 en vez de 1.

2) Si, es correcto. En tu solución asumiste que los nodos en memoria almacenan los punteros en el formato Segmento-Offset cuando en general en 8086 se almacenan en el formato Offset-Segmento (ver por ejemplo el vector de interrupciones)

3) No deberías poner el "word ptr" en ese caso, porque no hay ambigüedad. Los PUSH son siempre de palabras.

Sobre C), tenés que identificar si hay una rama con el peor caso o si todas las ramas son iguales, y luego identificar la estructura de árbol con N nodos que implique mayor consumo de stack. En tu ejemplo ambas ramas de la recursión cuestan lo mismo por lo que basta con considerar un árbol degenerado en lista y calcular el consumo de stack para ese caso (planteando el consumo en la recurrencia para esa estructura).

Saludos,
  Gustavo