01/10/2018, 00:41
Xem giúp mình lỗi sai trong bài xây dựng cây nhị phân từ biểu thức
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<<"
bieu thuc nhap la";
fflush(stdin);
getline(cin,str);
tree.caybieuthuc(str);
//Duyet cay
cout<<"
Duyet theo thu tu truoc:";
tree.preOrder(tree.getRoot(),pri);
cout<<"
Duyet theo thu tu giua:";
tree.inOrder(tree.getRoot(), pri);
cout<<"
Duyet theo thu tu sau:";
tree.postOrder(tree.getRoot(),pri);
getch();
return 0;
}
Bài liên quan