Arbol de expresiones en c++
Publicado por Rene (1 intervención) el 06/05/2020 04:58:47
Tengo un problema con un codigo, tengo que hacer un codigo reciba una expresion como ((5*6)/8), por cada paretesis abierto crea un nodo vacio, cada numero crea un nodo con el respectivo numero y los operadores ocupen un nodo vacio y al final de guardar todo se imprimir expresion infija, prefija y postfija con el resultado.
Hice un de arbol binario de menores y mayores, supongo que es parecido pero nose por donde empezar ya se manejario por string supongo
Hice un de arbol binario de menores y mayores, supongo que es parecido pero nose por donde empezar ya se manejario por string supongo
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
#include "pch.h"
#include <iostream>
using namespace std;
class ArbolABB {
private:
class Nodo {
public:
Nodo(const int dat, Nodo *izq = NULL, Nodo *der = NULL) :
dato(dat), izquierdo(izq), derecho(der) {}
int dato;
Nodo *izquierdo;
Nodo *derecho;
};
Nodo *raiz;
Nodo *actual;
int contador;
int altura;
public:
ArbolABB() : raiz(NULL), actual(NULL) {}
~ArbolABB() { BorarTodo(raiz); }
void Insertar(const int dat);
void Borrar(const int dat);
bool Buscar(const int dat);
bool Max();
bool Vacio(Nodo *r) { return r == NULL; }
int &ValorActual() { return actual->dato; }
void PreOrden(Nodo *nodo = NULL, bool r = true);
private:
void BorarTodo(Nodo* &);
};
void ArbolABB::BorarTodo(Nodo* &nodo)
{
if (nodo) {
BorarTodo(nodo->izquierdo);
BorarTodo(nodo->derecho);
delete nodo;
nodo = NULL;
}
}
void ArbolABB::Insertar(const int dat)
{
Nodo *padre = NULL;
actual = raiz;
while (Vacio(actual)==NULL ) {
padre = actual;
if (dat > actual->dato) actual = actual->derecho;
else if (dat <= actual->dato) actual = actual->izquierdo;
}
if (Vacio(actual) == NULL) return;
if (Vacio(padre) != NULL) raiz = new Nodo(dat);
else if (dat <= padre->dato) padre->izquierdo = new Nodo(dat);
else if (dat > padre->dato) padre->derecho = new Nodo(dat);
}
void ArbolABB::Borrar(const int dat)
{
Nodo *padre = NULL;
Nodo *nodo;
int aux;
actual = raiz;
while (!Vacio(actual)) {
if (dat == actual->dato) {
if (!actual->derecho && !actual->izquierdo) {
if (padre)
if (padre->derecho == actual) padre->derecho = NULL;
else if (padre->izquierdo == actual) padre->izquierdo = NULL;
delete actual;
actual = NULL;
return;
}
else {
padre = actual;
if (actual->derecho) {
nodo = actual->derecho;
while (nodo->izquierdo) {
padre = nodo;
nodo = nodo->izquierdo;
}
}
else {
nodo = actual->izquierdo;
while (nodo->derecho) {
padre = nodo;
nodo = nodo->derecho;
}
}
aux = actual->dato;
actual->dato = nodo->dato;
nodo->dato = aux;
actual = nodo;
}
}
else {
padre = actual;
if (dat > actual->dato) actual = actual->derecho;
else if (dat < actual->dato) actual = actual->izquierdo;
}
}
}
bool ArbolABB::Max()
{
actual = raiz;
while (!Vacio(actual)) {
if (actual->derecho == NULL) {cout << "El valor maximo es el: " << actual->dato << endl; return true; }
actual = actual->derecho;
}
cout << "No esta en el arbol" << endl; return false;
}
void ArbolABB::PreOrden(Nodo *nodo, bool r)
{
if (r) nodo = raiz;
cout << nodo->dato << ",";
if (nodo->izquierdo) PreOrden(nodo->izquierdo, false);
if (nodo->derecho) PreOrden(nodo->derecho, false);
}
bool ArbolABB::Buscar(const int dat)
{
actual = raiz;
while (!Vacio(actual)) {
if (dat == actual->dato){ cout << "El dato "<< dat <<" esta en el arbol" << endl; return true; }
else if (dat > actual->dato) actual = actual->derecho; // Seguir
else if (dat < actual->dato) actual = actual->izquierdo;
}
cout << "El dato " << dat << " no esta en el arbol" << endl; return false;
}
int main()
{
system("pause");
}
Valora esta pregunta


0