Conjunto Sobre ABBs.c2
Conjunto Sobre ABBs.c2
Conjunto Sobre ABBs.c2
private:
struct Nodo {
T valor;
Nodo* izq;
Nodo* der;
Nodo(const T& v) :
valor(v), izq(NULL), der(NULL) {
}
};
/*...*/
Representación de los nodos
private:
struct Nodo {
T valor;
Nodo* izq;
Nodo* der;
Nodo(const T& v) :
valor(v), izq(NULL), der(NULL) {
}
};
Nodo* raiz;
raiz es la única variable de instancia y apunta al nodo raı́z del
ABB, o es NULL si el ABB no tiene nodos
Representación de los nodos
¿En qué se diferencia con la estructura de la lista doblemente
enlazada?
private:
struct Nodo {
T valor;
Nodo* prev;
Nodo* sig;
Nodo(const T& v) :
valor(v), prev(NULL), sig(NULL) {
}
};
Nodo* cab;
¿Representan lo mismo? ¿Se comportan igual?
Abb b;
b.agregar(3);
b.agregar(1);
b.agregar(4);
b.agregar(0);
b.agregar(2);
b.inorden();
Inorden con Pila: Ejemplo
s = [3];
s = [3,1];
s = [3,1,0];
Inorden con Pila: Ejemplo
s = [3,1];
0;
s = [3];
1;
Inorden con Pila: Ejemplo
s = [3,2];
2;
s = [3];
3;
s = [];
Inorden con Pila: Ejemplo
s = [4];
4;
s = [];
Inorden con la cantidad de nodos precalculada (2)
private:
struct Nodo {
T valor;
Nodo* izq;
Nodo* der;
int cant;
Nodo(const T& v) :
valor(v), izq(NULL), der(NULL), cant(0){
}
};
/*...*/
Las hojas tienen 0 hijos
Inorden con la cantidad de nodos precalculada (2)
I La idea es:
I Actualizar cant al agregar/eliminar nodos en O(1)
I En inorden devolver un vector de nodos ordenados
I La posicion se puede calculcar con la cantidad de nodos de
cada subarbol en O(1)
I El vector puede llenarse en O(n)
Inorden con cant: Implementación
void inOrder(vector<T>& v) {
/* considero los nodas anteriores */
int indice = cantIzq();
v[indice] = info;