根据中序遍历序列和后序序列建立二叉树(即将中序表达式是转换为后序表达式)

算法思想
如下图,右边序列为二叉树(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值