以下的代码是表达式二叉树创建的函数,你参考吧:
//////////////////////////////////////////////////
//CreExpBinTree()公有成员函数
//通过当前的表达式来创建对应的表达式二叉树
//////////////////////////////////////////////////
void Expression::CreExpBinTree()
{
LinkedStack<char> Opstk;
//运算符栈
Opstk.Push('#');
//左优先级最高的运算符入栈
LinkedStack<BinTreeNode<ExpNode>*>
Pointstk;
//二叉树的结点指针栈
BinTreeNode<ExpNode>* pTree; //表达式二叉树的结点指针变量
ExpNode* ptr=Exp->link;
//遍历单链表的指针
while(ptr!=NULL)
{
if(ptr->etype==0)
//如果遇到的是数据结点
{
pTree=new
//新建一个表达式二叉树的结点
BinTreeNode<ExpNode>;
pTree->data=*ptr;
//数据域的拷贝
Pointstk.Push(pTree);//把新建的数据结点
ptr=ptr->link;
//继续遍历下个结点
}
else
//如果遇到的是运算符
{
char lop;
Opstk.getTop(lop);
//获取栈顶的运算符
char rop=ptr->info.op;
if(leftp(lop)<
//但前运算符要压栈了
rightp(rop))
{
Opstk.Push(rop);
ptr=ptr->link;
}
else
{
BinTreeNode<ExpNode>* x;
BinTreeNode<ExpNode>* y;
char op;
BinTreeNode<ExpNode>* res;
Opstk.Pop(op);
//从堆栈弹出的运算符
if(op=='#')
{
Pointstk.getTop(res);
root=res;
//返回最终的二叉树的根结点
return;
};
if(op!='(')
//如果弹出的不是左括号(作括号运算没有操作数)
{
//得到右左子结点的指针
Pointstk.Pop(y);
Pointstk.Pop(x);
res=new BinTreeNode<ExpNode>;
res->data.etype=1;
res->data.info.op=op;
res->leftChild=x;
res->rightChild=y;
Pointstk.Push(res);
}
else
ptr=ptr->link;
};
};
};
};
///////////////////////////////CreExpBinTree()函数