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
0