算法思想
如下图,右边序列为二叉树(B)的中序和后序序列,左边为中序表达式和后序表达式,刚好与二叉树的中序和后序表达式相对应。根据中序序列建立二叉树的思想,如图
后序遍历二叉树的算法
void postioder(BTNode *root)
{
if(root!=NULL)
{
postioder(root->lchild);
postoder(root->rchild);
cout<<root->key;
}
}
建立中序序列二叉树,然后后序输出,即可得到后缀表达式;
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define MAXSIZE 10
typedef struct BTNode{//树节点
char key;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
BTNode *createBTree( char f[])//实现中缀表达式构建二叉树
{
char Stackoperate[MAXSIZE];int topo =-1;
BTNode *StackBTNode[MAXSIZE];int topb =-1;
BTNode *node;
char *p=f;
while(*p!='\0')//遍历输出顺序表的字符
{
if(*p=='+'||*p=='-'||*p=='*'||*p=='/')
{
if((topo!=-1)&&(*p=='+'||*p=='-'))//优先级判断
{
node = (BTNode*)malloc(sizeof(BTNode));
node->key=Stackoperate[topo--];
node->rchild=StackBTNode[topb--];
node->lchild=StackBTNode[topb--];
StackBTNode[++topb]=node;
Stackoperate[++topo]=*p;
}
else{
Stackoperate[++topo]=*p;
}
}
else{
node=(BTNode*)malloc(sizeof(BTNode));
node->key=*p;
node->lchild=node->rchild=NULL;
StackBTNode[++topb]=node;
}
++p;
}
while(topo!=-1)
{
node=(BTNode*)malloc(sizeof(BTNode));
node->key=Stackoperate[topo--];
node->rchild=StackBTNode[topb--];
node->lchild=StackBTNode[topb--];
StackBTNode[++topb]=node;
}
return StackBTNode[topb];
}
void postioder(BTNode *root)
{
if(root!=NULL)
{
postioder(root->lchild);
postoder(root->rchild);
cout<<root->key;
}
}
int main()
{
char f[]="A+B*C-D/E";
BTNode *root=createBTree(f);
postioder(root);
return 0;
}