【代码】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxSize 100
typedef struct BTNode
{
char data;
struct BTNode* lchild, *rchild;
}BTNode;
//后序和中序确定一棵二叉树
BTNode* CreateBT(char post[], char in[], int l1, int r1, int l2, int r2)
{
if (l1 > r1)
return NULL;
BTNode* bt = (BTNode*)malloc(sizeof(BTNode));
bt->data = post[r1];
//在中序序列中查找根结点的位置
int i;
for (i = l2; i <= r2; ++i)
if (in[i] == post[r1])
break;
//确定左右子树
bt->lchild = CreateBT(post, in, l1, l1 + i - l2 - 1, l2, i - 1);
bt->rchild = CreateBT(post, in, l1 + i - l2, r1 - 1, i + 1, r2);
return bt;
}
//非递归先序遍历,获取前缀表达式
char* preorder(BTNode* root,int n)
{
char* s = (char*)malloc(sizeof(char)*(n + 1));
int i = 0;
if (root != NULL)
{
BTNode* stack[maxSize];
int top = -1;
BTNode* p = NULL;
//根结点入栈
stack[++top] = root;
while (top != -1)
{
p = stack[top--];
//存储出栈元素
s[i++] = p->data;
//先将p的右子树入栈,再将其左子树入栈
if (p->rchild != NULL)
stack[++top] = p->rchild;
if (p->lchild != NULL)
stack[++top] = p->lchild;
}
}
s[i] = '\0';
return s;
}
int main()
{
char post[maxSize] = "ABC*+DE/-";
char in[maxSize] = "A+B*C-D/E";
int l1 = 0, r1 = strlen(post) - 1;
int l2 = 0, r2 = strlen(in) - 1;
BTNode* root = CreateBT(post, in, l1,r1, l2, r2);
char* s = preorder(root, r1 - l1 + 1);
puts(s);
system("pause");
return 0;
}