typedef struct node_
{
int value;
node_* leftChild;
node_* rightChild;
node_* parent;
ntype type;
node_():rightChild(0),leftChild(0),parent(0),type(sign){};
}tree_node;
tree_node* CArithTree::Input(char* &cdata)
{
if(cdata)
{
int nlen = strlen(cdata);
tree_node* numberNdLeft = 0;
tree_node* numberNdRight = 0;
tree_node* psubRoot = 0;
while(*cdata)
{
switch(*cdata)
{
case '(':{
if(psubRoot)
{
psubRoot->leftChild = numberNdLeft;
psubRoot->rightChild = (numberNdRight = Input(++cdata));
numberNdLeft->parent = numberNdRight->parent = psubRoot;
numberNdLeft = psubRoot;
numberNdRight = 0;
psubRoot=0;
//return psubRoot;
}
else
++cdata;
}break;
case ')':{
++cdata;
return numberNdLeft;
}break;
case '+':case '-':case '*':case '/':{
psubRoot = new tree_node;
psubRoot->value = *cdata;
++cdata;
}break;
default:
{
if(!psubRoot)
{
numberNdLeft = new tree_node;
numberNdLeft->value = getnumbers(cdata);
numberNdLeft->type = leaf;
if(!numberNdLeft->value)
return false;
}
else
{
numberNdRight = new tree_node;
numberNdRight->value = getnumbers(cdata);
numberNdRight->type = leaf;
if(!numberNdRight->value)
return false;
psubRoot->leftChild = numberNdLeft;
psubRoot->rightChild = numberNdRight;
numberNdLeft->parent = numberNdRight->parent = psubRoot;
numberNdLeft = psubRoot;
numberNdRight = 0;
psubRoot=0;
}
}
}
}
return numberNdLeft;
}
return 0;
}
后面补上解析代码:
int CArithTree::parse(tree_node* Root)
{
int nleftValue = 0, nrightValue = 0;
if(Root)
{
Root = Root->leftChild;
switch(Root->type )
{
case leaf:nleftValue = Root->value;break;
case sign:nleftValue = parse(Root);break;
default:return 0 ;break;
}
Root = Root->parent;
char nSign = (char)Root->value;
Root = Root->rightChild;
if(sign == Root->type)
nrightValue = parse(Root);
else if(leaf == Root->type)
nrightValue = Root->value;
else
return 0;
switch(nSign)
{
case '+':return nleftValue+nrightValue;break;
case '-':return nleftValue-nrightValue;break;
case '*':return nleftValue*nrightValue;break;
case '/':return nleftValue/nrightValue;break;
default:return 0;
}
}
return 0;
}