ARBOLES C++
Tengo que hacer una practica en la que tengo que utilizar arboles binarios ( de expresion) para introducir una expresion y luego evaluarla. Y la verdad no se por donde cogerlo. Tengo que usar pilas para ver las prioridades? NO se, no tengo ni idea, me podeis ehcar una mano??
Gracias por adelantado!!
Gracias por adelantado!!
Un buen lugar para empesar es el google. Pon "arboles binarios" y encontrarás varios sitios y archivos pdf con explicaciones y ejemplos.
Alejandro
Alejandro
Si, si la verdad es q se como se manejan los arboles binarios el problema es mas bien de C++ que no lo conozco, lo q me gustaria es codigo para poder ver como va, como implementarlos y todo eso
Te envio un programa que trabaja con arboles binarios y el header file generico.
Espero que sea util.
*************************************************************************
// program k20a5.cpp - page 411
// binary search tree : print inorder, preorder and postorder forms.
// (not recursive solution).
// c++ exercices book - dr. gershon kagan - first edition : 2001
// written in Borland CPP ver 3.1
#include "Tree.h"
enum type {IN,PRE,POST};
char *msg[3] = {"InOrder","PreOrder","PostOrder"};
void Print(Node<int> *p)
{
if(first)
{
cout << "{" << p->info;
first = 0;
}
else
cout << "," << p->info;
} // PRINT
void Traversal(Node<int> *p,int sw)
{
if(!p)
return;
switch(sw)
{
case PRE : Print(p); // PreOrder : Node-Left-Rigth
Traversal(p->left,sw); // NLR
Traversal(p->right,sw);
break;
case IN : Traversal(p->left,sw); // InOrder : Left-Node-Rigth
Print(p); // LNR
Traversal(p->right,sw);
break;
case POST : Traversal(p->left,sw); // PostOrder : Left-Rigth-Node
Traversal(p->right,sw); // LRN
Print(p);
break;
}
} // TRAVERSAL
void Show(Node<int> *p,int sw)
{
cout << setw(9) << msg[sw] << ": ";
if(!p)
cout << "{empty tree}" << endl;
else
{
first = 1;
Traversal(p,sw);
cout << "}" << endl;
}
} // SHOW
void Process()
{
int data[] = {40,20,10,5,15,13,17,16,30,35,33,60,
50,45,43,47,42,44,70,65,67,68};
Tree<int> a(sizeof(data)/sizeof(int),data);
Node<int> *p = a.GetRoot();
Show(p,IN);
Show(p,PRE);
Show(p,POST);
} // PROCESS
void main()
{
clrscr();
cout << "binary search tree : print inorder, preorder and postorder "
<< "forms.\n";
cout << "-----------------------------------------------------"
"-------------------------\n";
Process();
cout << "-----------------------------------------------------"
"-------------------------\n";
cout << "end of program - good bye ! ! !\n";
getch();
} // MAIN
**************************************************************************
// program Tree.h - page 410 . . . . .
// Header File for Tree class.
// c++ exercices book - dr. gershon kagan - first edition : 2001
// written in Borland CPP ver 3.1
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
// -------------------------------------------------------------------------
template <class T>
struct Node
{
T info;
Node<T> *left,
*right;
Node(T = 0);
}; // STRUCT NODE
template <class T>
Node<T>::Node(T INFO = 0)
{
info = INFO;
left = NULL;
right = NULL;
} // NODE CONSTRUCTOR
// -------------------------------------------------------------------------
template <class T>
class Tree
{
private:
Node<T> *root;
int len;
public:
Tree(int = 0,T* = NULL);
~Tree();
void Insert(Node<T>*,T);
Node<T> *GetRoot() {return root;};
void SetRoot(Node<T> *p) {root = p;};
int GetLen() {return len;};
void SetLen(int x) {len += x;};
void Show() const;
void operator=(Tree<T> &);
}; // CLASS TREE
// -------------------------------------------------------------------------
template <class T>
void Tree<T>::Insert(Node<T> *p,T data)
{
if(p->info < data)
{
if(!p->right)
p->right = new Node<T>(data);
else
Insert(p->right,data);
}
else
{
if(!p->left)
p->left = new Node<T>(data);
else
Insert(p->left,data);
}
} // INSERT
template <class T>
Tree<T>::Tree(int num = 0,T *data = NULL)
{
len = 0;
if(!num)
root = NULL;
else
{
root = new Node<T>(data[0]);
len++;
for(int i = 1;i < num;i++)
{
Insert(root,data[i]);
len++;
}
}
} // TREE CONSTRUCTOR
template <class T>
void TreeDel(Node<T> *p)
{
if(!p)
return;
TreeDel(p->left);
TreeDel(p->right);
if(p)
delete(p);
} // TREE DEL
template <class T>
Tree<T>::~Tree()
{
if(len) // avoid unnecesary delete in program k20a24.cpp
TreeDel(root);
} // TREE DESTRUCTOR
int first;
template <class T>
void Traversal(Node<T> *p)
{
if(!p)
return;
Traversal(p->left);
if(first)
{
cout << "{" << p->info;
first = 0;
}
else
cout << "," << p->info;
Traversal(p->right);
} // TRAVERSAL
template <class T>
void Tree<T>::Show() const
{
Node<T> *p = root;
if(!p)
cout << "{empty tree}" << endl;
else
{
first = 1;
Traversal(p);
cout << "}" << endl;
}
} // TREE SHOW
template <class T>
Node<T> *CopyTree(Node<T> *p)
{
if(!p)
return NULL;
Node<T> *q = new Node<int> (p->info);
q->left = CopyTree(p->left);
q->right = CopyTree(p->right);
return q;
} // COPY TREE
template <class T>
void Tree<T>::operator=(Tree<T> &right)
{
root = CopyTree(right.GetRoot());
} // OPERATOR EQUAL
// -------------------------------------------------------------------------
Espero que sea util.
*************************************************************************
// program k20a5.cpp - page 411
// binary search tree : print inorder, preorder and postorder forms.
// (not recursive solution).
// c++ exercices book - dr. gershon kagan - first edition : 2001
// written in Borland CPP ver 3.1
#include "Tree.h"
enum type {IN,PRE,POST};
char *msg[3] = {"InOrder","PreOrder","PostOrder"};
void Print(Node<int> *p)
{
if(first)
{
cout << "{" << p->info;
first = 0;
}
else
cout << "," << p->info;
void Traversal(Node<int> *p,int sw)
{
if(!p)
return;
switch(sw)
{
case PRE : Print(p); // PreOrder : Node-Left-Rigth
Traversal(p->left,sw); // NLR
Traversal(p->right,sw);
break;
case IN : Traversal(p->left,sw); // InOrder : Left-Node-Rigth
Print(p); // LNR
Traversal(p->right,sw);
break;
case POST : Traversal(p->left,sw); // PostOrder : Left-Rigth-Node
Traversal(p->right,sw); // LRN
Print(p);
break;
}
} // TRAVERSAL
void Show(Node<int> *p,int sw)
{
cout << setw(9) << msg[sw] << ": ";
if(!p)
cout << "{empty tree}" << endl;
else
{
first = 1;
Traversal(p,sw);
cout << "}" << endl;
}
} // SHOW
void Process()
{
int data[] = {40,20,10,5,15,13,17,16,30,35,33,60,
50,45,43,47,42,44,70,65,67,68};
Tree<int> a(sizeof(data)/sizeof(int),data);
Node<int> *p = a.GetRoot();
Show(p,IN);
Show(p,PRE);
Show(p,POST);
} // PROCESS
void main()
{
clrscr();
cout << "binary search tree : print inorder, preorder and postorder "
<< "forms.\n";
cout << "-----------------------------------------------------"
"-------------------------\n";
Process();
cout << "-----------------------------------------------------"
"-------------------------\n";
cout << "end of program - good bye ! ! !\n";
getch();
} // MAIN
**************************************************************************
// program Tree.h - page 410 . . . . .
// Header File for Tree class.
// c++ exercices book - dr. gershon kagan - first edition : 2001
// written in Borland CPP ver 3.1
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
// -------------------------------------------------------------------------
template <class T>
struct Node
{
T info;
Node<T> *left,
*right;
Node(T = 0);
}; // STRUCT NODE
template <class T>
Node<T>::Node(T INFO = 0)
{
info = INFO;
left = NULL;
right = NULL;
} // NODE CONSTRUCTOR
// -------------------------------------------------------------------------
template <class T>
class Tree
{
private:
Node<T> *root;
int len;
public:
Tree(int = 0,T* = NULL);
~Tree();
void Insert(Node<T>*,T);
Node<T> *GetRoot() {return root;};
void SetRoot(Node<T> *p) {root = p;};
int GetLen() {return len;};
void SetLen(int x) {len += x;};
void Show() const;
void operator=(Tree<T> &);
}; // CLASS TREE
// -------------------------------------------------------------------------
template <class T>
void Tree<T>::Insert(Node<T> *p,T data)
{
if(p->info < data)
{
if(!p->right)
p->right = new Node<T>(data);
else
Insert(p->right,data);
}
else
{
if(!p->left)
p->left = new Node<T>(data);
else
Insert(p->left,data);
}
} // INSERT
template <class T>
Tree<T>::Tree(int num = 0,T *data = NULL)
{
len = 0;
if(!num)
root = NULL;
else
{
root = new Node<T>(data[0]);
len++;
for(int i = 1;i < num;i++)
{
Insert(root,data[i]);
len++;
}
}
} // TREE CONSTRUCTOR
template <class T>
void TreeDel(Node<T> *p)
{
if(!p)
return;
TreeDel(p->left);
TreeDel(p->right);
if(p)
delete(p);
} // TREE DEL
template <class T>
Tree<T>::~Tree()
{
if(len) // avoid unnecesary delete in program k20a24.cpp
TreeDel(root);
} // TREE DESTRUCTOR
int first;
template <class T>
void Traversal(Node<T> *p)
{
if(!p)
return;
Traversal(p->left);
if(first)
{
cout << "{" << p->info;
first = 0;
}
else
cout << "," << p->info;
Traversal(p->right);
} // TRAVERSAL
template <class T>
void Tree<T>::Show() const
{
Node<T> *p = root;
if(!p)
cout << "{empty tree}" << endl;
else
{
first = 1;
Traversal(p);
cout << "}" << endl;
}
} // TREE SHOW
template <class T>
Node<T> *CopyTree(Node<T> *p)
{
if(!p)
return NULL;
Node<T> *q = new Node<int> (p->info);
q->left = CopyTree(p->left);
q->right = CopyTree(p->right);
return q;
} // COPY TREE
template <class T>
void Tree<T>::operator=(Tree<T> &right)
{
root = CopyTree(right.GetRoot());
} // OPERATOR EQUAL
// -------------------------------------------------------------------------
