PDA

View Full Version : تشکیل درخت



oloom1386
دوشنبه 24 خرداد 1389, 22:27 عصر
سلام بچه ها خسته نباشید
یه راهنمایی می خواستم در مورد تشکیل درخت برای یک عبارت اینفیکس
یه چیزایی نوشتم

#
include<iostream.h>
#include<conio.h>
template<class type>
class BTree;
template<class type>
class BNode
{
friend class BTree;
friend class Stack;
private:
type data;
BNode* lchild;
BNode* rchild;
enum opr ['(','+','-','/','*','%','||','&&','!'];
};
template<class type>
class Stack
{
private:
BNode* top;
public:
stack()
{
top->lchild=top->rchild=NULL;
}
int empty()
{
if(top==NULL) return 1;
else
return 0;
}
void push(BNode*);
void pop(BNode*);
};
template<class type>
class BTree
{
private:
BNode<char>*root;
public:
BTree()
{
root=NULL;
}
void INSERT(BNode<char>*);
char operand();
BNode olaviat(BNode<char>*,BNode<char>*);
void maketree();
void preorder(BNode*);
void postorder(BNode*);
void Display();
};
//int menu();
//////////////////////////////////////////////////////
void BTree<type>::INSERT(BNode<char>*p)
{

clrscr();
cout<<"\n\n";
while(1)
{
cout<<" PLEAS ENTER A EXPRESION\n";
gets(p);
maketree(p);
}
}
//************************************************** *****
void BTree<type>::maketree(BNode<char>*T)
{
BNode<char>* p,q,r;
T=root;
r=new BNode;
r->lchild=r->rchild=NULL;
r->data=p;
if(root==NULL)
root=r;
while(T!=NULL)
{
r=olaviat(p,q)
if(T->rchild!=NULL)
T=T->rchild;
else
{
T->rchild=r;
break;
}
if(T->lchild!=NULL)
T=T->lchild;
else
{
T->lchild=r;
break;
}

}

}
///////////////////////////////////////////////////
void BTree<type>::preorder(BNode<char>* p)
{
stack<BNode*> s;
BNode<char>* q;
while(1)
{
while(p)
{
cout<<p->data;
s.push(p);
}
if(!s.empty())
{
p=*pop(p);
p=olaviat(p,q);
p=p->lchild;
}
else
break;
}
}
/////////////////////////////////////////////////
void Stack<type>::push(BNode<char>* p)
{
p=newBNode;
if(!empty())
{
cout<<"STACK IS FULL...\n";
getch();
exit(0);
}
else{
p->rchild=top;
p->lchild=NULL;
top=p;
}
/* top=top->lchild;
top=top->rchild; */
}
//************************************************** ***
void Stack<type>::pop(BNode<char>* p)
{
if(empty())
{
cout<<"STACK IS EMPTY...\n";
getch();
exit(0);
}
else
{
p=top->rchild;
top=top->rchild;
top=top->lchild;
delet p;
}
}
//************************************************** *****
char BTree<type>::operand(BNode<char>* p)
{
int f=0;
clrscr();
cout<<"\n\n";
for(int i=0;p->data[i];i++)
{
if(p->data[i]>='A' && p->data[i]<='Z')
{
f=1;
cout<<p->data[i];
}
else
s.push(p->data[i]);
}
return 0;
}
///////////////////////////////////////////////////////////
//************************************************** ****
BNode BTree<type>::olaviat(BNode<char>op1,BNode<char>op2)
{

if(!s.empty())
{
op2=* s.pop(op1);
op1=op1->rchild;
if(op2=='(')
while(op2!=')')
{
if((op2.opr<op1.opr)||op2.opr==op1.opr))
return op1;
} }
}
//////////////////////////////////////////////////////////////////
void BTree<type>::Display()
{

while(p)
{
cout<<p->data;
p=p->lchild;

ramin061
پنج شنبه 11 خرداد 1391, 12:32 عصر
از برنامه ممنون ولی درخط 56 void BTree<type>::INSERT( BNode<char>*p) مشکل داره وخطای type name expectedرو میده اگه میشه راهنمایی کنین