RosettaCodeData/Task/AVL-tree/FreeBASIC/avl-tree-2.basic

140 lines
3.0 KiB
Plaintext

Type Nodo
valor As Integer
izda As Nodo Ptr
dcha As Nodo Ptr
End Type
Function createNodo(Byval v As Integer, Byval l As Nodo Ptr, Byval r As Nodo Ptr) As Nodo Ptr
Dim nuevo As Nodo Ptr = 0
nuevo = Callocate(Len(Nodo))
nuevo->valor = v
nuevo->izda = l
nuevo->dcha = r
Return nuevo
End Function
Function insertar(Byval v As Integer, n As Nodo Ptr) As Nodo Ptr
If (n = 0) Then
n = createNodo(v, 0, 0)
Elseif (v < n->valor) Then
n->izda = insertar(v, n->izda)
Elseif (v > n->valor) Then
n->dcha = insertar(v, n->dcha)
End If
Return n
End Function
Function encuentraMin(Byval n As Nodo Ptr) As Nodo Ptr
If (n = 0) Then Return 0
While (n->izda <> 0)
n = n->izda
Wend
Return n
End Function
Function encuentraMax(Byval n As Nodo Ptr) As Nodo Ptr
If (n = 0) Then Return 0
While (n->dcha <> 0)
n = n->dcha
Wend
Return n
End Function
Function preOrden(Byval n As Nodo Ptr) As Nodo Ptr
If (n = 0) Then Return 0
Print (n->valor);
preOrden(n->izda)
preOrden(n->dcha)
Return 0
End Function
Function postOrden(Byval n As Nodo Ptr) As Nodo Ptr
If (n = 0) Then Return 0
postOrden(n->izda)
postOrden(n->dcha)
Print (n->valor);
Return 0
End Function
Function enOrden(Byval n As Nodo Ptr) As Nodo Ptr
If (n = 0) Then Return 0
enOrden(n->izda)
Print (n->valor);
enOrden(n->dcha)
Return 0
End Function
Function eliminarMin(n As Nodo Ptr) As Nodo Ptr
If n = 0 Then Return 0
Dim As Nodo Ptr old = 0
If (n->izda <> 0) Then
n->izda = eliminarMin(n->izda)
Else
old = n
n = n->dcha
Deallocate old
End If
Return n
End Function
Function eliminarMax(n As Nodo Ptr) As Nodo Ptr
If n = 0 Then Return 0
Dim As Nodo Ptr old = 0
If (n->dcha <> 0) Then
n->dcha = eliminarMax(n->dcha)
Else
old = n
n = n->izda
Deallocate old
End If
Return n
End Function
Function eliminar(Byval v As Integer, n As Nodo Ptr) As Nodo Ptr
If n = 0 Then Return 0
Dim As Nodo Ptr old = 0
If v < n->valor Then
n->izda = eliminar(v, n->izda)
Elseif v > n->valor Then
n->dcha = eliminar(v, n->dcha)
Elseif (n->izda <> 0) And (n->dcha <> 0) Then
n->valor = encuentraMax(n->izda)->valor
n->izda = eliminarMax(n->izda)
Else
old = n
n = Iif(n->izda = 0, n->dcha, n->izda)
Deallocate old
End If
Return n
End Function
Dim raiz As Nodo Ptr = 0
raiz = insertar(10, raiz)
raiz = insertar(11, raiz)
raiz = insertar(5 , raiz)
raiz = insertar(8 , raiz)
raiz = insertar(2 , raiz)
raiz = insertar(7 , raiz)
Print "preOrder : "; preOrden(raiz)
Print !"\postOrder : "; postOrden(raiz)
Print !"\inOrder : "; enOrden(raiz)
Print !"\nremoving 5 from tree\n"
raiz = eliminar(5, raiz)
Print "preOrder : "; preOrden(raiz)
Print !"\postOrder : "; postOrden(raiz)
Print !"\inOrder : "; enOrden(raiz)(root)
Sleep