Pascal/Turbo Pascal - Problema árbol binario

 
Vista:
sin imagen de perfil

Problema árbol binario

Publicado por Diego (98 intervenciones) el 02/10/2013 00:46:42
Buenas noches, tengo un problema, no se bien como utilizar una estructura arbol para generar otro arbol con un criterio diferente.
Osea, tengo un arbol binario de búsqueda, los mayores a la derecha, y los menores a la izquierda.
El problema es el siguiente:


Dado un árbol binario de números enteros, genere otro ordenado con los valores impares, tal que el
hijo izquierdo sea mayor que la raíz, y el hijo derecho sea menor que la misma.




-----Para agregar un nodo nuevo en el criterio que pide solo bastaria con copiar el proceso agregar_nodo y cambiar izq con der. pero el problema que me suege es como le envio ese número al proceso.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
program ejericicio2;
type
    arbol =^nodo;
    nodo = record
      elemen : integer;
      izq : arbol;
      der : arbol;
    end;
procedure crear_arbol(var a : arbol);
  begin
       a := nil;
  end;
procedure agregar_nodo(var a: arbol; num: integer);
  begin
    if (a = nil) then
      begin
        new(a);
        a^.elemen := num;
        a^.izq := nil;
        a^.der:= nil;
      end
    else
      if (num > a^.elemen) then
        agregar_nodo(a^.der, num)
      else
        agregar_nodo(a^.izq, num);
  end;
procedure imprimirA(a : arbol);
  begin
    if (a <> nil) then
      begin
        write(a^.elemen, ' ');
        imprimirA(a^.izq);
        imprimirA(a^.der);
      end;
  end;
var
  num : integer;
  tree : arbol;
begin
  crear_arbol(tree);
  write('Ingrese un número: ');
  readln(num);
  while (num <> -1) do
    begin
      agregar_nodo(tree, num);
      write('Ingrese un número: ');
      readln(num);
    end;
  writeln('----Inciso-----');
  imprimirA(tree);
  writeln();
  readln();
  readln();
end.
Espero noticias, de como resolver este problema
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema árbol binario

Publicado por ramon (2158 intervenciones) el 04/10/2013 18:09:40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
{Mira lo tullo con algo que puede valerte}
 
program ejericicio2;
uses
   crt;
type
      arbol =^nodo;
       nodo = record
          elemen : integer;
             izq : arbol;
             der : arbol;
           end;
 
     ppila = ^pila;
     pila = record
            datp : integer;
            sige : ppila;
          end;
 
    var
    da, num : integer;
       tree1, tree : arbol;
  ordn, pil : ppila;
 
 
   procedure entra_a_pila(dato: integer; var pil: ppila);
   var
     aux : ppila;
    begin
       if pil = nil then
       begin
         New(pil);
         pil^.datp := dato;
         pil^.sige := nil;
       end
    else
       begin
         aux := pil;
         New(pil);
         pil^.datp := dato;
         pil^.sige := aux;
     end;
   end;
 
  procedure saca_de_pila(var pil: ppila; var da : integer);
  var
    aux: ppila;
    begin
       if pil <> nil then
       begin
       aux := pil;
       da := aux^.datp;
       pil := pil^.sige;
       dispose(aux);
       end;
    end;
 
    procedure ordena(dd : ppila);
    var
      i, p, b, t, tem : integer;
      arr : array[1..199] of integer;
     begin
        t := 1;
        while dd <> nil do
        begin
           arr[t] := dd^.datp;
           dd := dd^.sige;
           t := t + 1;
        end;
        for p := 1 to t - 1 do
          for b := t - 1 downto p + 1 do
          if arr[p] > arr[b] then
          begin
             tem := arr[p];
             arr[p] := arr[b];
             arr[b] := tem;
          end;
          for p := 1 to t - 1 do
          write('  ',arr[p]);
          writeln;
          i := round((t - 1) / 2);
          write('          ',arr[i]);
          writeln;
          if i < 1 then
          i := 1;
          tem := arr[1];
          pil := nil;
          for p := 1 to t - 1 do
          begin
          if arr[p] <> tem then
          entra_a_pila(arr[p],pil);
          end;
          entra_a_pila(tem,pil);
     end;
 
    procedure crear_arbol(var a : arbol);
    begin
       a := nil;
    end;
 
   procedure agregar_nodo(var a: arbol; num: integer; como : char);
   begin
      if (a = nil) then
      begin
         new(a);
         a^.elemen := num;
         a^.izq := nil;
         a^.der:= nil;
      end
   else
      if (num > a^.elemen) then
      if upcase(como) = 'N' then
      agregar_nodo(a^.der, num, como)
    else
      agregar_nodo(a^.izq, num, como)
    else
       if upcase(como) = 'R' then
       agregar_nodo(a^.der, num, como)
     else
       agregar_nodo(a^.izq, num, como);
    end;
 
    procedure imprimirA(a : arbol);
    begin
      if (a <> nil) then
       begin
           write(a^.elemen, ' ');
           if a^.elemen mod 2 > 0 then
           begin
              entra_a_pila(a^.elemen,pil);
           end;
           imprimirA(a^.izq);
           imprimirA(a^.der);
       end;
    end;
 
    procedure imprimirb(a : arbol);
    begin
      if (a <> nil) then
       begin
           write('  ',a^.elemen);
           writeln;
           imprimirb(a^.der);
           imprimirb(a^.izq);
       end;
    end;
 
   begin
     clrscr;
     pil := nil;
     crear_arbol(tree);
     write('Ingrese un numero : ');
     readln(num);
     while (num <> -1) do
     begin
         agregar_nodo(tree, num, 'n');
         write('Ingrese un numero : ');
         readln(num);
     end;
      writeln('----Inciso-----');
      imprimirA(tree);
      writeln;
      crear_arbol(tree1);
      ordena(pil);
      while pil <> nil do
      begin
      saca_de_pila(pil,da);
      agregar_nodo(tree1, da,'r');
      end;
      writeln;
      imprimirb(tree1);
      writeln;
      readln;
   end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar