CB100

Notas, resueltos y tps de la materia Algoritmos y Estructuras de Datos
Index Commits Files Refs README
commit e8247e3ce93feaf9f0544b6df61999b467b18123
parent 2b5b44f49cf2cc66e2658641c03adacc91d6372f
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Wed, 23 Jul 2025 00:43:54 -0300

updated `notas/arbol`

Diffstat:
Mnotas/arbol/arboles.md | 70+++++++++++++++++++++++++++++++++++-----------------------------------
Mnotas/arbol/arboles.pdf | 0
Mnotas/arbol/img/Makefile | 8++++----
Mnotas/arbol/img/src/arbol_heap_vector.gv | 2+-
Mnotas/arbol/style.tex | 27++-------------------------
5 files changed, 42 insertions(+), 65 deletions(-)
diff --git a/notas/arbol/arboles.md b/notas/arbol/arboles.md
@@ -85,11 +85,13 @@ cuando el dato esta en una hoja).
     [https://www.youtube.com/watch?v=jDM6_TnYIqE&t=239s](https://www.youtube.com/watch?v=jDM6_TnYIqE&t=239s).
 
 Cuando se **inserta** o **elimina** un elemento en el árbol se lo hace siguiendo
-un orden. El caso en que el nodo a eliminar tiene uno o dos hijos es trivial, lo
-particular es cuando el nodo tiene dos hijos, en ese caso se debe reemplazar el
-nodo eliminado por el sucesor inorden, esto es el nodo que se debería visitar si
-se acabara de visitar el nodo eliminado (con recorrido inorden) esto resulta en
-el nodo más a la izquierda del subárbol derecho del nodo eliminado.
+un orden. El caso en que el nodo a eliminar tiene uno o ningún hijo es trivial,
+cuando el nodo tiene dos hijos, se debe reemplazar el nodo eliminado por el
+sucesor inorden, esto es, el nodo que se debería visitar si se acabara de
+visitar el nodo eliminado (con recorrido inorden) esto resulta en el nodo más a
+la izquierda del subárbol derecho del nodo eliminado, otras implementaciones
+utilizan el predecesor inorden, lo que resulta en el nodo mas a la derecha del
+subárbol izquierdo.
 
 ### Maneras de recorrer un árbol binario
 
@@ -149,8 +151,8 @@ alguna hoja, no lo estarían.
 Se dice que un árbol esta completo, si todas sus hojas están llenas excepto el
 ultimo nivel, que debe estar casi-completo de izquierda a derecha, es decir,
 puede haber hojas vacías pero deben estar lo más a la derecha posible y solo en
-el ultimo nivel. En la figura 1 ambos arboles están completos. A un árbol que no
-es completo también se le dice **desequilibrado**.
+el ultimo nivel. En la figura 1 ambos arboles están completos. A un árbol
+incompleto también se le dice **desequilibrado**.
 
 #### Árbol degenerado o patológico
 
@@ -478,15 +480,15 @@ mínimo.
 \end{figure}
 
 Los arboles heap típicamente se almacenan en vectores, almacenando los valores
-por nivel, es decir, para un padre en posición $k$ sus hijos se almacenaran en
-la posición $(2*k)+1$ y $(2*k)+2$ del vector para el hijo izquierdo y derecho
-respectivamente, análogamente, si el hijo esta en la posición $h$ del vector, el
-padre estará en la posición $floor((h-1)/2)$. Almacenando los arboles en
-vectores permite acceder a los datos de forma directa. En la figura 10 se
-muestra como se almacena el árbol heap de máximo de la figura 9.1, como
-particularidad se ve que el primer elemento es la raíz, lo cual es el elemento
-más grande por ser heap de máximo, si fuera de mínimo este sería el menor
-elemento.
+por nivel, contanto $k$ desde $0$, para un padre en posición $k$ sus hijos se
+almacenan en la posición $(2*k)+1$ y $(2*k)+2$ del vector para el hijo
+izquierdo y derecho respectivamente, análogamente, si el hijo esta en la
+posición $h$ del vector, el padre estará en la posición $floor((h-1)/2)$.
+Almacenando los arboles en vectores permite acceder a los datos de forma
+directa. En la figura 10 se muestra como se almacena el árbol heap de máximo de
+la figura 9.1, como particularidad se ve que el primer elemento es la raíz, lo
+cual es el elemento más grande por ser heap de máximo, si fuera de mínimo este
+sería el menor elemento.
 
 \begin{figure}[H]
   \centering
@@ -533,31 +535,29 @@ denominado `arr`, el lenguaje utilizado es python
 ```python
 def heapify(arr, n, i):
   # Se asume que la raiz es maxima
-  largest = i
+  max = i
 
-  # posicion de hijo izquierdo
+  # posicion de hijo izquierdo y derecho
   left = (2*i) + 1
-
-  # posicion de hijo derecho
   right = (2*i) + 2
 
   # se comprueba si hay hijo izquierdo y es 
   # mayor a la raiz
-  if left < n and arr[left] > arr[largest]:
-      largest = left
-
-  # se comprueba si hay hijo derecho y es mayor
-  # a la raiz o al hijo izquierdo
-  if right < n and arr[right] > arr[largest]:
-      largest = right
-
-  # si la raiz no es maxima se intercambia con
-  # el maximo hijo, y se llama recursivamente
-  # a heapify para continuar con el algoritmo
-  # con los hijos restantes
-  if largest != i:
-      arr[i], arr[largest] = arr[largest], arr[i]
-      heapify(arr, n, largest)
+  if left < n and arr[left] > arr[max]:
+      max = left
+
+  # se comprueba si hay hijo derecho y es
+  # mayor a la raiz o al hijo izquierdo
+  if right < n and arr[right] > arr[max]:
+      max = right
+
+  # si la raiz no es maxima se intercambia
+  # con el maximo hijo, y se llama
+  # recursivamente a heapify para reordenar
+  # los hijos restantes
+  if max != i:
+      arr[i], arr[max] = arr[max], arr[i]
+      heapify(arr, n, max)
 ```
 
 ## Heapsort
diff --git a/notas/arbol/arboles.pdf b/notas/arbol/arboles.pdf
Binary files differ.
diff --git a/notas/arbol/img/Makefile b/notas/arbol/img/Makefile
@@ -1,7 +1,7 @@
 SRC_DIR = src
 BIN_DIR = bin
 SOURCES = $(shell find $(SRC_DIR) -name "*.gv")
-TARGETS = $(patsubst $(SRC_DIR)/%.gv,%.png,$(SOURCES))
+TARGETS = $(patsubst $(SRC_DIR)/%.gv,$(BIN_DIR)/%.png,$(SOURCES))
 
 all: $(BIN_DIR) $(TARGETS)
 .PHONY: all clean
@@ -9,11 +9,11 @@ all: $(BIN_DIR) $(TARGETS)
 $(BIN_DIR):
     mkdir -p $(BIN_DIR)
 
-%.png: $(SRC_DIR)/%.gv
+$(BIN_DIR)/%.png: $(SRC_DIR)/%.gv
     @if [ ! -d "$(BIN_DIR)" ]; then \
         mkdir -p $(BIN_DIR); \
     fi
-    dot -Tpng $< -o $(BIN_DIR)/$@
+    dot -T png $< -o $@
 
 clean:
-    rm -r $(BIN_DIR)
+    rm -rf $(BIN_DIR)
diff --git a/notas/arbol/img/src/arbol_heap_vector.gv b/notas/arbol/img/src/arbol_heap_vector.gv
@@ -2,5 +2,5 @@ graph {
     node[shape=record, penwidth=2, fontsize=22, fontname="sans"];
     edge [penwidth=2.0];
 
-   array [label="<f0> 50 | <f1> 30 | <f2> 20 | <f3> 15 | <f4> 10 | <f5>  8 | <f6> 16"];
+    array [label="<f0> 50 | <f1> 30 | <f2> 20 | <f3> 15 | <f4> 10 | <f5>  8 | <f6> 16"];
 }
diff --git a/notas/arbol/style.tex b/notas/arbol/style.tex
@@ -99,7 +99,7 @@ BoldFont        =   *-Bold,
 % \titlespacing{command}{left spacing}{before spacing}{after spacing}[right]
 
 \titlespacing*{\section}
-{0pt}{2.00ex plus 0.25ex minus 0.10ex}{1.25ex plus 0.00ex}
+{0pt}{1.50ex plus 0.25ex minus 0.10ex}{1.25ex plus 0.00ex}
 
 \titlespacing*{\subsection}
 {0pt}{1.25ex plus 0.10ex minus 0.10ex}{0.75ex plus 0.00ex}
@@ -120,7 +120,6 @@ BoldFont        =   *-Bold,
 % \setlength{\textfloatsep}{2pt plus 1.0pt minus 2.0pt}
 % \setlength{\intextsep}{2pt plus 1.0pt minus 2.0pt}
 
-
 \setlength{\abovecaptionskip}{1.00em}  % above caption
 \setlength{\belowcaptionskip}{-0.85em} % below caption
 
@@ -293,25 +292,6 @@ BoldFont        =   *-Bold,
 
 \usepackage{xcolor}
 
-\definecolor{bggray}{rgb}{0.95,0.95,0.95}
-\definecolor{keywordcolor}{rgb}{0.2,0.2,0.7}
-\definecolor{commentcolor}{rgb}{0.0,0.5,0.0}
-\definecolor{stringcolor}{rgb}{0.6,0.1,0.1}
-
-\lstset{
-  backgroundcolor=\color{bggray},
-  basicstyle=\ttfamily\small,
-  breaklines=true,
-  breakatwhitespace=true,
-  columns=fullflexible,
-  % frame=single,
-  showstringspaces=false,
-  keywordstyle=\color{keywordcolor}\bfseries,
-  commentstyle=\color{commentcolor}\itshape,
-  stringstyle=\color{stringcolor},
-  numbers=none,
-}
-
 % tango style
 \definecolor{bgcolor}{HTML}{F6F6F6}
 \definecolor{keywordcolor}{HTML}{204A87}
@@ -321,9 +301,7 @@ BoldFont        =   *-Bold,
 \definecolor{operatorcolor}{HTML}{CE5C00}
 \definecolor{identifiercolor}{HTML}{000000} % For general text
 
-% === Listings configuration ===
 \lstset{
-  language=Python,                 % Change this for other languages
   backgroundcolor=\color{bgcolor},
   basicstyle=\ttfamily\small,
   keywordstyle=\color{keywordcolor}\bfseries,
@@ -337,8 +315,7 @@ BoldFont        =   *-Bold,
   columns=fullflexible,
   showstringspaces=true,
   frame=single,
-  framerule=0pt,
+  framerule=1pt,
   xleftmargin=0pt,
   moredelim=**[is][\color{operatorcolor}\bfseries]{@}{@}, % allow inline operator styling using @...@
 }
-