输入
第一行为中序序列 第二行为后续序列
输出
输出为遍历二叉树得到的先序序列
样例输入
BFDAEGC
FDBGECA
样例输出
ABDFCEG
已知一棵二叉树的后序序列和中序序列,构造该二叉树的过程如下:
1. 根据后序序列的最后一个元素建立根结点;
2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
3. 在后序序列中确定左右子树的后序序列;
4. 由左子树的后序序列和中序序列建立左子树;
5. 由右子树的后序序列和中序序列建立右子树。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
struct btree
{
char st;
btree *left, *right;
};
btree* build(char *fina,char *mid,long n)//后序,中序,二叉树节点个数
{
btree *b;
char *p;
long k;
if (n <= 0)
return NULL;
b = new btree;
b->st = *(fina + n - 1);//确定根结点
for (p = mid; p < mid + n; p++)
{
if (*p == *(fina+n-1))
break;
}
k = p - mid;//剩余结点个数
b->left = build(fina, mid, k);
b->right = build(fina+k,p + 1, n - 1 - k);
return b;//返回根节点
}
void Printf(btree *root)//先序遍历
{
if (root == NULL)
{
return;
}
cout << root->st;
Printf(root->left);
Printf(root->right);
}
int main()
{
char mid[1000];
char last[1000];
cin >> mid >> last;
btree *root = build(last, mid, strlen(last));
Printf(root);
return 0;
}