Mateo Sanabria Ardila
Estructura de Datos y Algoritmos
Es un grafo conexo, aciclico.
Es un grafo conexo, aciclico tal que el grado de cada nodo no es mayor a 2.
Es un árbol binario donde cada nodo tiene una llave y un valor donde:
La llave en cualquier nodo es más grande que cualquier llave en el subárbol izquierdo y más pequeña que las llaves en el subarbol derecho.
Es un árbol binario donde cada nodo tiene una llave y un valor donde:
La llave en cualquier nodo es más grande que cualquier llave en el subárbol izquierdo y más pequeña que las llaves en el subarbol derecho.
La llave en cualquier nodo es más grande que cualquier llave en el subárbol izquierdo y más pequeña que las llaves en el subarbol derecho.
Existe el elemento con llave K:12?
Existe el elemento con llave K:12?
Existe el elemento con llave K:10?
Node (BST)
get (search)
put (insert)
delete
max/min
rank
key: LLave del nodo
value: Valor del nodo
size: Tamaño subarbol
left: Subarbol izquierdo
right: Subarbol derecho
def newNode(key, value, size):
node = {'key': key,
'value': value,
'size': size,
'left': None,
'right': None,
'type': 'BST'}
return node
def newBST(omaptype, cmpfunction, datastructure):
try:
bst = {'root': None,
'cmpfunction': cmpfunction,
'type': omaptype,
'datastructure': datastructure}
if(cmpfunction is None):
bst['cmpfunction'] = defaultfunction
else:
bst['cmpfunction'] = cmpfunction
return bst
except Exception as exp:
error.reraise(exp, 'BST:NewMap')
def get(bst, key):
try:
node = getNode(bst['root'], key, bst['cmpfunction'])
return node
except Exception as exp:
error.reraise(exp, 'Bst:get')
def getNode(root, key, cmpfunction):
try:
node = None
if (root is not None):
# Comparar llaves con la de nodo actual
cmp = cmpfunction(key, root['key'])
if (cmp == 0):
node = root
elif (cmp < 0):
# Si es menor -> Busqueda en la izq
node = getNode(root['left'], key, cmpfunction)
else:
# Si es mayor -> Busqueda en la der
node = getNode(root['right'], key, cmpfunction)
# Si el nodo actual es None, se retorna None
return node
except Exception as exp:
error.reraise(exp, 'BST:getNode')
def put(bst, key, value):
try:
bst['root'] = insertNode(bst['root'],
key,
value,
bst['cmpfunction'])
return bst
except Exception as exp:
error.reraise(exp, 'Bst:Put')
def insertNode(root, key, value, cmpfunction):
try:
if (root is None):
root = bstnode.newNode(key, value, 1)
else:
cmp = cmpfunction(key, root['key'])
# La llave a insertar es menor que la raiz
if (cmp < 0):
root['left'] = insertNode(root['left'], key, value, cmpfunction)
# La llave a insertar es mayor que la raiz
elif (cmp > 0):
root['right'] = insertNode(root['right'], key, value, cmpfunction)
# La llave a insertar es igual que la raiz
else:
root['value'] = value
leftsize = sizeTree(root['left'])
rightsize = sizeTree(root['right'])
root['size'] = 1 + leftsize + rightsize
return root
except Exception as exp:
error.reraise(exp, 'BST:insertNode')
La estructura de un BST puede variar dependiendo del orden en el que se hacen los puts de los nodos
La estructura de un BST puede variar dependiendo del orden en el que se hacen los puts de los nodos: las llaves llegan en orden tal que el arbol esta balanceado
La estructura de un BST puede variar dependiendo del orden en el que se hacen los puts de los nodos: las llaves llegan siempre en orden decreciente/creciente
La estructura de un BST puede variar dependiendo del orden en el que se hacen los puts de los nodos: las llaves llega en desorden
def delete(bst, key):
try:
bst['root'] = deleteNode(bst['root'],
key,
bst['cmpfunction'])
return bst
except Exception as exp:
error.reraise(exp, 'Bst:Remove')
Opción 0:Dejar el valor en None, la clave queda en el árbol para guiar la búsqueda
Opción 1:Borrar el nodo
Caso 0: No tiene hijos, cambiar referencia del padre a None
Opción 1:Borrar el nodo
Caso 1: Tiene 1 hijo, “darle el hijo al abuelo”
Opción 1:Borrar el nodo
Caso 2: Tiene 2 hijos
def deleteNode(root, key, cmpfunction):
try:
if (root is not None):
cmp = cmpfunction(key, root['key'])
if (cmp == 0): # La llave es la que se busca
if (root['right'] is None): # No tiene hijo derecho
return root['left']
elif (root['left'] is None): # No tiene hijo izquierdo
return root['right']
else: # se cambia por el menor de los mayores
elem = root
root = minKeyNode(elem['right'])
root['right'] = deleteMinTree(elem['right'])
root['left'] = elem['left']
elif (cmp < 0):
root['left'] = deleteNode(root['left'], key, cmpfunction)
else:
root['right'] = deleteNode(root['right'], key, cmpfunction)
root['size'] = 1 + sizeTree(root['left']) + sizeTree(root['right'])
return root
except Exception as exp:
error.reraise(exp, 'BST:deleteNode')