Los torneos en línea necesitan ordenar jugadores según su puntaje para mostrar tablas de posiciones, detectar empates y seleccionar rivales. Un árbol binario de búsqueda permite insertar nuevos resultados sin procesar toda la tabla, consultar un jugador por su puntaje y generar reportes ordenados al instante.
Registrar en un ABB las puntuaciones:
El sistema debe:
Incluye el nombre y el puntaje. Utilizamos cadenas cortas (hasta 31 caracteres más terminador).
typedef struct PlayerNode {
char nombre[32];
int puntaje;
struct PlayerNode *izquierdo;
struct PlayerNode *derecho;
} PlayerNode;
El orden del árbol se basa en el puntaje. Si dos jugadores empatan, los ubicamos en la rama derecha para mantener consistencia.
PlayerNode *crearJugador(const char *nombre, int puntaje) {
PlayerNode *n = malloc(sizeof(PlayerNode));
if (!n) return NULL;
strncpy(n->nombre, nombre, sizeof(n->nombre) - 1);
n->nombre[sizeof(n->nombre) - 1] = '\0';
n->puntaje = puntaje;
n->izquierdo = NULL;
n->derecho = NULL;
return n;
}
PlayerNode *insertarJugador(PlayerNode *raiz, const char *nombre, int puntaje) {
if (!raiz) return crearJugador(nombre, puntaje);
if (puntaje < raiz->puntaje) {
raiz->izquierdo = insertarJugador(raiz->izquierdo, nombre, puntaje);
} else {
raiz->derecho = insertarJugador(raiz->derecho, nombre, puntaje);
}
return raiz;
}
La consulta retorna el nodo del jugador o NULL si el puntaje no existe.
PlayerNode *buscarPorPuntaje(PlayerNode *raiz, int puntaje) {
if (!raiz) return NULL;
if (puntaje == raiz->puntaje) return raiz;
return (puntaje < raiz->puntaje)
? buscarPorPuntaje(raiz->izquierdo, puntaje)
: buscarPorPuntaje(raiz->derecho, puntaje);
}
Un recorrido postorden invertido (derecha, nodo, izquierda) genera la tabla de mayor a menor puntaje.
void imprimirTablaDesc(PlayerNode *raiz) {
if (!raiz) return;
imprimirTablaDesc(raiz->derecho);
printf("%s - %d\n", raiz->nombre, raiz->puntaje);
imprimirTablaDesc(raiz->izquierdo);
}
NULL.Programa que arma el ranking, muestra la tabla y consulta un puntaje.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct PlayerNode {
char nombre[32];
int puntaje;
struct PlayerNode *izquierdo;
struct PlayerNode *derecho;
} PlayerNode;
PlayerNode *crearJugador(const char *nombre, int puntaje) {
PlayerNode *n = malloc(sizeof(PlayerNode));
if (!n) return NULL;
strncpy(n->nombre, nombre, sizeof(n->nombre) - 1);
n->nombre[sizeof(n->nombre) - 1] = '\0';
n->puntaje = puntaje;
n->izquierdo = NULL;
n->derecho = NULL;
return n;
}
PlayerNode *insertarJugador(PlayerNode *raiz, const char *nombre, int puntaje) {
if (!raiz) return crearJugador(nombre, puntaje);
if (puntaje < raiz->puntaje) {
raiz->izquierdo = insertarJugador(raiz->izquierdo, nombre, puntaje);
} else {
raiz->derecho = insertarJugador(raiz->derecho, nombre, puntaje);
}
return raiz;
}
PlayerNode *buscarPorPuntaje(PlayerNode *raiz, int puntaje) {
if (!raiz) return NULL;
if (puntaje == raiz->puntaje) return raiz;
return (puntaje < raiz->puntaje)
? buscarPorPuntaje(raiz->izquierdo, puntaje)
: buscarPorPuntaje(raiz->derecho, puntaje);
}
void imprimirTablaDesc(PlayerNode *raiz) {
if (!raiz) return;
imprimirTablaDesc(raiz->derecho);
printf("%s - %d\n", raiz->nombre, raiz->puntaje);
imprimirTablaDesc(raiz->izquierdo);
}
void liberar(PlayerNode *raiz) {
if (!raiz) return;
liberar(raiz->izquierdo);
liberar(raiz->derecho);
free(raiz);
}
int main(void) {
PlayerNode *ranking = NULL;
ranking = insertarJugador(ranking, "Ana", 1800);
ranking = insertarJugador(ranking, "Bruno", 1650);
ranking = insertarJugador(ranking, "Carla", 2050);
ranking = insertarJugador(ranking, "Diego", 1500);
ranking = insertarJugador(ranking, "Elena", 1900);
ranking = insertarJugador(ranking, "Facundo", 2100);
ranking = insertarJugador(ranking, "Gael", 1900); /* puntaje repetido */
puts("Tabla descendente:");
imprimirTablaDesc(ranking);
int consulta = 1900;
PlayerNode *jugador = buscarPorPuntaje(ranking, consulta);
if (jugador) {
printf("\nPrimer jugador con %d puntos: %s\n", consulta, jugador->nombre);
} else {
printf("\nNo hay jugadores con %d puntos\n", consulta);
}
liberar(ranking);
return 0;
}