Professional Documents
Culture Documents
Nivel 0 A Rama AF
Nivel 1 B E F
Rama FI
Nivel 2 C D G H I
padres: A, B, F Hojas: C, D, E, G,
hijos: B, E, F, C, D,G, H, H, I
Ihermanos: {B, E, F}, {C, D}, {G, H, I}
EJEMPLO 20.2
A
A
C
completo
B
B C
D E F G lleno
D E F G
H I J K .
EJEMPLO 20.3
* *
+ -
+ -
X * A B
X Y A B
Y Z
rbol de expresin (X+Y)*(A-B) rbol de expresin (X+(Y*Z))+(A-B)
EJEMPLO 20.4
1
* *
+ *
+
A *-
+ C +
* C-*
A
B B-
A B A +
Z+
X Y
C D
(A+B)*C A+B*(-(C+D)) (A*(X+Y))*C
EJEMPLO 20.5
*
A *
A *
A
Camino A, B, D, E, C, F Y G Camino D,B,E,A,F,C Y G Camino D,E,B,F,G,C y A
1 4 7
+
B -*
C +
B -*
C +
B -*
C
2 5 2 6 3 6
D E F G D E F G D E F G
3 4 6 7 1 3 5 7 1 2 4 5
EJEMPLO 20.6.
55 30 menor que 55 5 12
41 mayor que 30
75 mayor que 55
30 75 4 7
85 mayor que 75 8 16
1 6 8
4 41 85 7 11
3 7 9
EJEMPLO 20.7 .
30 30
10 40 10 40
8 25 32 8 25 32
12 12
14
EJEMPLO 20.8
2
30 30 30
5 40
5 5 40
40
2 80 2 36 80
2
(a) Insercin de 80 (b) Insercin de 36
EJEMPLO 20.9
30 30
5 40 5 40
2 85
2 36 85
EJEMPLO 20.10..
4 7
1 6 8
3 7 9
EJEMPLO 20.11.
40 40
20 60 20 55
10 30 50 70
10 30 50 70
45 55
45 54
54
EJERCICIO 20.1
3
La primera estructura no es un rbol binario ya que el nodo cuyo contenido es B tiene tres hijos
y le mximo nmero de hijos de un rbol binario es dos. Esta estructura es un un rbol general.
La segunda no es un rbol binario porque hay dos caminos distintos para ir al nodo F y por tanto
no se expresa la jerarqua de la definicin de rbol un rbol en general y de un binario en
particular. La tercera por la misma razn que la segunda no es un rbol binario.
EJERCICIO 20.2
a) Su altura es cuatro.
b) El rbol est equilibrado ya que la diferencia de las alturas de los subrboles izquierdo y
derecho es como mximo uno.
c) Los nodos hoja son: W, T, X, V.
d) El predecesor inmediato (padre) del nodo U es el nodo que contiene R.
e) Los hijos del nodo R son U y V.
f) Los sucesores del nodo R son U, V, X.
EJERCICIO 20.3
Recorrido RDI : P, R, V, U, X, Q, T, S, W.
Recorrido DRI : V, R, X, U, P, T, Q, S, W.
Recorrido DIR : V, X, U, R, T, W, S, Q.
EJERCICIO 20.4
E Y
E Y
T
R M T
I II
C
A O
R
N
M Y
F S
E
E L
R
III IV
4
b) los recorridos en inorden, preorden y postorden de cada uno de los rboles son:
Inorden: E, M, R, T, Y Inorden: E, M, R, T, Y
Preorden: M, E, Y, T, R Preorden: R, E, M, Y, T
Prostorden: E, R, T, Y, M Prostorden: M, E, T, Y, R
I II
Inorden: E, M, T, R,Y Inorden: A, C, E, F, K, L, N, O,
Preorden: T, M, E, Y, R R, S
Prostorden: E, M, R, Y, T Preorden: C, A, O, N, F, E, L, K,
R, S
Prostorden: A, E, K, L, F, N, S, R,
O, L
III IV
EJERCICIO 20.5:
/ +
A +
-
+
/
B
A B C D
C D
-
X
A
/
A
I
- +
A B +
+
B - E F
C D
E F
C D (A+B) * ((C+D) / (E+F))
5
/
-
-
A
B
* /
C D E F
EJERCICIO 20.6.
A
P
D Z
L
F
H
G
K
W
PREORDEN: A, D, F, G, H, K, L, P, Q, R, W, Z.
INORDEN: G, F, H, K, O, L, A, W, R, Q, P, Z.
PROBLEMA 20.1
6
};
class Nodo
{
private:
Telemento e; // elemento que se almacena
Arbol hi, hd; // hijo izquierdo y derecho son rboles
friend class Arbol; // Arbol es clase amiga de Nodo
public:
Nodo (Arbol ai, Telemento x, Arbol ad); // contructor
~ Nodo(){}; //destructor
};
Arbol Arbol::Ohi()
{
return a->hi;
};
Arbol Arbol::Ohd()
{
return a->hd;
};
Telemento Arbol::Oraiz()
{
return a->e;
};
Arbol::~Arbol()
{
if (a)
delete a;
}
7
PROBLEMA 20.2
PROBLEMA 20.3
PROBLEMA 20.4
PROBLEMA 20.5
PROBLEMA 20.6
8
cout << a->e <<" XXX" << endl;
a->hd.IRD();
}
}
void Arbol::IDR()
{
if (a !=NULL)
{
a->hi.IDR();
a->hd.IDR();
cout << a->e <<" XXX" << endl;
}
}
void Arbol::RID()
{
if (a !=NULL)
{
cout << a->e <<" XXX" << endl;
a->hi.RID();
a->hd.RID();
}
}
PROBLEMA 20.7
int Arbol::Cuantos()
{
if (a!= NULL)
return 1+ a->hi.Cuantos() + a->hd.Cuantos();
else
return 0;
}
PROBLEMA 20.8
int Arbol::CuantasH()
{
if (a!= NULL)
if (a->hi.a == NULL && a->hi.a == NULL)
return 1;
else
return a->hi.CuantasH() + a->hd.CuantasH();
else
return 0;
}
PROBLEMA 20.9
void Arbol::NodosNivel(int n)
{
if (a)
if (n == 1)
cout << a->e ;
else
{
a->hi.NodosNivel(n - 1);
9
a->hd.NodosNivel(n - 1);
}
}
PROBLEMA 20.10
void Arbol::RecorreMayores(Telemento e)
{
if (a)
{
if(a->e > e)
cout << a->el << endl;
a->hi.RecorreMayores(e);
a->hd.RecorreMayores(e);
}
}
PROBLEMA 20.11
10
Ant->hi.a = nuevo;
}
PROBLEMA 20.12
void Arbol::BorrarAI(Telemento x)
{
Nodo * Ant = NULL, *aborrar, *pos = a;
bool enc = false;
while (!enc && pos != NULL) // no encontrado y quede rbol
{
if (pos->e == x)
enc = true; // encontrado
else
{
Ant = pos; // quedarse con el anterior
11
if( pos->e < x )
pos = pos->hd.a; // avanza a la derecha
else
pos = pos->hi.a; // avanza a la derecha
}
}
if (enc)
{
if ( pos-> hd.a == NULL) // no hijo derecho
{
if (Ant) // no es la raz
if (Ant->hd.a == pos) // pos es hijo derecho de Ant
Ant->hd.a = pos->hi.a;
else
Ant->hi.a= pos->hi.a;
else // es la raz
a = pos->hi.a;
pos->hi = Arbol() ;
delete pos;
}
else if ( pos-> hi.a ==0) // no hijo izquierdo
{
if (Ant) // no es la raz
if (Ant->hd.a == pos) //pos es hijo izquierdo de Ant
Ant->hd.a = pos->hd.a;
else
Ant->hi.a = pos->hd.a;
else
a = pos->hd.a;
pos->hd= Arbol();
delete pos;
}
else // dos hijos predecesor inmediato
a->hi.BorPI(a->e); // uno a la izquierda, y todo derecha
}
else
cout << " no encontrado";
}
12