git » orga2-tp1.git » commit 6787248

Implementar eliminar a nodos con 2 hijos

author Rodrigo Campos
2011-04-09 23:48:28 UTC
committer Rodrigo Campos
2011-04-09 23:52:48 UTC
parent 2cc92ee5aa2348ffe7c3e17cb9bd6b6bbb8b5043

Implementar eliminar a nodos con 2 hijos

bintree.asm +56 -3
test.c +12 -12

diff --git a/bintree.asm b/bintree.asm
index d229a99..dbf53c6 100644
--- a/bintree.asm
+++ b/bintree.asm
@@ -217,11 +217,9 @@ eliminar:
 	je .eliminar1
 
 	; Tiene 2 hijos
+	jmp .eliminar2
 
 
-
-	jmp .fin
-
 .eliminar0:
 	push edi ; nodo *padre, 3º param
 	push esi ; nodo *nodo, 2º param
@@ -238,6 +236,35 @@ eliminar:
 	add esp, 12
 	jmp .fin
 
+.eliminar2:
+
+	push dword .nDer ; subarbol derecho del nodo a borrar
+	call buscar_min
+	add esp, 4
+	
+	; copiarme el id, nombre y puntaje a registros
+	mov cx, [eax + off_id]
+	mov edx, [eax + off_nom]
+	mov edi, [eax + off_puntaje]
+	push ecx
+	push edx
+	push edi
+
+	; nos llamamos recursivamente
+	push ecx ; id 
+	push ebx ; nodo **arbol
+	call eliminar
+	add esp, 8
+
+	; ponemos en esi el nombre, puntaje y id que guardamos en registros/stack
+	pop edi
+	pop edx
+	pop ecx
+	mov [esi + off_id], cx
+	mov [esi + off_nom], edx
+	mov [esi + off_puntaje], edi
+	jmp .fin
+
 .fin:
 	pop ebx
 	pop esi
@@ -407,6 +434,32 @@ eliminar_1_hijo:
 	pop ebp
 	ret
 
+; nodo *buscar_min(nodo *arbol)
+buscar_min:
+	push ebp
+	mov ebp, esp
+	push edi
+	push esi
+	push ebx
+
+	mov eax, [ebp + 8]; nodo *arbol
+	%define .nIzq [eax + off_izq]
+
+	; el minimo es el nodo de mas a la izquierda
+.loop:
+	cmp dword .nIzq, 0
+	je .fin
+	mov eax, .nIzq
+	jmp .loop
+
+.fin:
+	pop ebx
+	pop esi
+	pop edi
+	pop ebp
+	ret
+
+
 destruirArbol:
 	push ebp
 	mov ebp, esp
diff --git a/test.c b/test.c
index 037a400..fd02260 100644
--- a/test.c
+++ b/test.c
@@ -27,25 +27,25 @@ int main()
 	nodo *e = NULL;
 	insertar(&e, "nodoe", 32, 7.5);
 	insertar(&e, "nodoe", 30, 7.5);
-
-	if (e->izq->izq == NULL)
-		printf("hijo iz es NULL\n");
-	else
-		printf("hijo iz es NO es NULL\n");
+	insertar(&e, "nodoe", 34, 7.5);
 
 	insertar(&e, "nodoe", 31, 7.5);
 
-	if (e->izq->izq == NULL)
-		printf("hijo iz es NULL\n");
-	else
-		printf("hijo iz es NO es NULL\n");
-
+	
 	printf("31 == %d\n", e->izq->der->id);
 
 	printf("Hola puto\n");
-	eliminar(&e, 30);
-	eliminar(&e, 31);
+	//eliminar(&e, 30);
+	//eliminar(&e, 31);
 	eliminar(&e, 32);
 
+	printf("id de la raiz es: %d\n", e->id);
+	if (e->der == NULL)
+		printf("hijo der es NULL\n");
+	else
+		printf("hijo der NO es NULL\n");
+	printf("1º hijo: %d\n", e->izq->id);
+	printf("2º hijo: %d\n", e->izq->der->id);
+
 	return 0;
 }