Anh em giúp mình với xem bài này sai chỗ nào bài này là xây dựng cây nhị phân biểu thức nhập từ 1 biểu thức trung tố cảm ơn ae
#ifndef BTREENODE_CPP
#define BTREENODE_CPP 1
#include"iostream"
using namespace std;
template <class T>
class BTreeNode{
private:
T elem ;
BTreeNode *parent,*left,*right ;
public:
BTreeNode(){
parent = NULL ;
left = NULL ;
right = NULL ;
}
BTreeNode *getParent(){ return parent; }
BTreeNode *getLeft(){return left;}
BTreeNode *getRight(){ return right;}
void setParent(BTreeNode *p){ parent = p ;}
void setLeft(BTreeNode *p){ left = p;}
void setRight(BTreeNode *p){ right = p ; }
void setElem(T element){ elem = element ; }
T getElem(){ return elem ; }
int hasLeft(){ return left != NULL; }
int hasRight(){ return right != NULL; }
};
#endif
#ifndef BINARYTREE_CPP
#define BINARYTREE_CPP 1
#include "BTreeNod.cpp"
#include<stack>
#include<string>
template <class T>
class BTree {
private:
BTreeNode<T>* root;
int n;
public:
BTree(){ root=NULL; n=0;}
BTreeNode<T>* getRoot(){ return root;}
int isEmpty(){
return root==NULL;
}
int size(){return n;}
int isInternal(BTreeNode<T>*v){
return(v->hasLeft()|| v->hasRight()) ;
}
int isExternal(BTreeNode<T>*v) {
return (!v->hasLeft()) && (!v->hasRight()) ;
}
int isRoot(BTreeNode<T>*v){
return v->getParent()==NULL;
}
void preOrder(BTreeNode<T>*,void (*visit)(BTreeNode<T>*));
void inOrder(BTreeNode<T>*,void (*visit)(BTreeNode<T>*));
void postOrder(BTreeNode<T>*,void (*visit)(BTreeNode<T>*));
BTreeNode<T>* insert(BTreeNode<T>*,int,T);
void remove(BTreeNode<T>*);
void caybieuthuc(string str);
};
int ut (char c)
{
if (c=='(') return 0;
if (c=='+'|| c=='-') return 1;
if (c=='*'|| c=='/') return 2;
if (c=='^') return 3;
}
template <class T>
void BTree<T>::inOrder(BTreeNode<T>* v,
void (*visit)(BTreeNode<T>* a)){
if(v!=NULL){
inOrder(v->getLeft(),visit);
visit(v);
inOrder(v->getRight(),visit);
}
}
template <class T>
void BTree<T>::postOrder(BTreeNode<T>* v,
void (*visit)(BTreeNode<T>* a)){
if(v!=NULL){
postOrder(v->getLeft(),visit);
postOrder(v->getRight(),visit);
visit(v);
}
}
template <class T>
void BTree<T>::preOrder(BTreeNode<T>* v,
void (*visit)(BTreeNode<T>* a)){
if(v!=NULL){
visit(v);
preOrder(v->getLeft(),visit);
preOrder(v->getRight(),visit);
}
}
template <class T>
void BTree<T>::remove(BTreeNode<T>*v){
if(v!=NULL){
remove(v->getLeft());
remove(v->getRight());
delete v;
}
}
template <class T>
BTreeNode<T>* BTree<T>::insert(BTreeNode<T>* parent,
int LeftRight,T elem){
BTreeNode<T>* p = new BTreeNode<T> ;
p->setParent(parent);
p->setElem(elem);
if (parent==NULL)
root = p;
else
if(LeftRight==1)
parent->setRight(p);
else
parent->setLeft(p);
n++;
return p;
}
template <class T>
void BTree<T>::caybieuthuc(string str)
{
BTree<char> tree;
BTreeNode<char> *p;
stack <char>s;
stack <char>s1;
char l,r,n;
int i = 0 ;
string str1 = "";
while (i<str.length())
{
char c = str.at(i);
if (c!= ' ')
{
if (c-'0'>=0 && c-'0'<=9|| isalpha(c))
{
s1.push(c);
l = s1.top();
s1.pop();
r = s1.top();
s1.pop();
}
else
{
cout<<str1 <<" ";
str1="";
if(c=='(') s.push(c);
else
{
if(c==')')
{
while (s.top()!='(')
{
n =s.top() ;
s.pop();
p = tree.insert(NULL,0, n);
p = tree.insert(tree.getRoot(),0, l);
p = tree.insert(tree.getRoot(),1, r);
s1.push(n);
}
s.pop();
}
else
{
while (!s.empty()&& ut(c) <=ut(s.top()))
{
s.pop();
n = s.top();
p = tree.insert(NULL,0, n);
p = tree.insert(tree.getRoot(),0, l);
p = tree.insert(tree.getRoot(),1, r);
s1.push(n);
}
s.push(c);
}
}
}
}
i++;
}
if (str1!= "") cout<<str1 <<" ";
while(!s1.empty())
{
s1.pop();
}
}
#endif
#include<conio.h>
#include"stdio.h"
#include<iostream>
#include "Btree.cpp"
using namespace std;
void pri(BTreeNode<int> *p){
cout<<p->getElem()<<" ";
}
int main(){
BTree<int> tree;
BTreeNode<int> *p;
//Tao cay
string str;
cout<<"\n bieu thuc nhap la";
fflush(stdin);
getline(cin,str);
tree.caybieuthuc(str);
//Duyet cay
cout<<"\n Duyet theo thu tu truoc:";
tree.preOrder(tree.getRoot(),pri);
cout<<"\n Duyet theo thu tu giua:";
tree.inOrder(tree.getRoot(), pri);
cout<<"\n Duyet theo thu tu sau:";
tree.postOrder(tree.getRoot(),pri);
getch();
return 0;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?