资源简介
表达式树是二叉树的一种应用,叶子是操作数,其余结点为操作符。例如,下图表示的表达式树,用中序遍历得到中序表达式 (a+b*c)+((d*e+f)*g)请编程实现表达式树的建立和遍历
代码片段和文件信息
#include
#include
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 100
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 100
typedef char Elemtype;
typedef struct
{
Elemtype *elem;
int length;
int listsize;
}SqList;
typedef char TElemtype;
typedef struct BiTNode
{
TElemtype data;
struct BiTNode *lchild*rchild;
}BiTNode*BiTree;
typedef char SElemtype;
typedef struct
{
SElemtype *base;
SElemtype *top;
int stacksize;
}SqStack;
void InitBiTree(BiTree &T) //初始化二叉树T
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)exit(-2);
}
BiTNode* predicate(SqList &Lint fristint last) //还要考虑小括号在最外层的情况
{
BiTree T1;
if(last-frist==1)
{
BiTree Ty;
InitBiTree(Ty);
Ty->data=L.elem[frist];
Ty->lchild=NULL;
Ty->rchild=NULL;
return Ty;
}
int flag=0jt=0ct=0t=0;
for(int i=frist;i {
if(L.elem[i]==‘(‘)flag++;
else if(L.elem[i]==‘)‘)flag--;
if(flag==0){
if(L.elem[i]==‘+‘||L.elem[i]==‘-‘)
jt=i;
else if(L.elem[i]==‘*‘||L.elem[i]==‘/‘)
ct=i;
}
}
if((ct==0)&&(jt==0))
T1=predicate(Lfrist+1last-1);
else{
if(jt>0)t=jt;
else if(ct>0)t=ct;
InitBiTree(T1);
T1->data=L.elem[t];
T1->lchild=predicate(Lfristt);
T1->rchild=predicate(Lt+1last);
}
return T1;
}
void InitList(SqList &L)
{
L.elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
if(!L.elem)exit(-2);
L.length=0;
L.listsize=LIST_INIT_SIZE;
}
void PreOrderTraverse (BiTree T) //先序遍历二叉树T
{
if(T==NULL)
{
return;
}
else
{ printf(“%c “T->data);
PreOrderTraverse (T->lchild);
PreOrderTraverse (T->rchild);
}
}
void InOrderTraverse (BiTree T) //中序遍历二叉树T
{
if(T==NULL)
{
return;
}
else
{
InOrderTraverse (T->lchild);
printf(“%c “T->data);
InOrderTraverse (T->rchild);
}
}
void PostOrderTraverse (BiTree T) //后序遍历二叉树T
{
if(T==NULL)
{
return;
}
else
{
PostOrderTraverse (T->lchild);
PostOrderTraverse (
评论
共有 条评论