以下的代码是表达式二叉树创建的函数,你参考吧:
//////////////////////////////////////////////////
//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()函数