算术表达式转换为以二叉树的结构存储
#include <iostream>
#include <malloc.h>
using namespace std;
typedef struct BiTNode
{
char data;
BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree afaToBiTree(char *afa, int s, int e)
{
if(e-s==1)
{
BiTree bn = (BiTree)malloc(sizeof(BiTNode));
bn->data = afa[s];
bn->lchild = NULL;
bn->rchild = NULL;
return bn;
}
int local_r = 0;
int flag = 0;
int m_m_p = 0;
int a_s_p = 0;
for(int i = s; i < e; i++)
{
if(afa[i] == '(')
{
flag++;
}
else if(afa[i] == ')')
{
flag--;
}
if(flag == 0)
{
if(afa[i] == '*' || afa[i] == '/' || afa[i] == '^')
{
m_m_p = i;
}
else if(afa[i] == '+' || afa[i] == '-')
{
a_s_p = i;
}
}
}
if((m_m_p == 0) && (a_s_p == 0))
{
afaToBiTree(afa, s+1, e-1);
}
else
{
if(a_s_p > 0)
{
local_r = a_s_p;
}
else if(m_m_p > 0)
{
local_r = m_m_p;
}
BiTree b = (BiTree)malloc(sizeof(BiTNode));
b->data = afa[local_r];
b->lchild = afaToBiTree(afa, s, local_r);
b->rchild = afaToBiTree(afa, local_r+1, e);
return b;
}
}
void visit(BiTree T)
{
if(T)
{
cout << T->data;
}
}
void PreOrderTraveral(BiTree T)
{
if(T)
{
visit(T);
PreOrderTraveral(T->lchild);
PreOrderTraveral(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
visit(T);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
visit(T);
}
}
int main()
{
BiTree T = NULL;
char str[50];
char *afa;
int n;
afa = str;
for(int i = 0; i < 50; i++)
{
cin >> str[i];
if(str[i] == '#')
{
n = i;
break;
}
}
T = afaToBiTree(afa, 0, n);
PreOrderTraveral(T);
cout << endl;
InOrderTraverse(T);
cout << endl;
PostOrderTraverse(T);
return 0;
}