本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。

输出格式:
在一行中输出 Preorder:

练习4.1 根据后序和中序遍历输出先序遍历 (25 分)_数据结构


练习4.1 根据后序和中序遍历输出先序遍历 (25 分)_c++_02

题目思路:
1.根据先序和中序可以确定一颗唯一的二叉树,采用递归的手段建立一颗二叉树。
2.建立完以后,进行常规的DLR递归遍历。

#include<iostream>
using namespace std;

typedef struct tree {
int data;
tree* left;
tree* right;
} * BinTree;
BinTree BuildTree(int* post, int* in, int n);
void DLR(BinTree T);
int main()
{
int n;
cin >> n;
int inorder[30], postorder[30];
for (int i = 0; i < n; i++)
cin >> postorder[i];

for (int i = 0; i < n; i++)
cin >> inorder[i];

BinTree T = BuildTree(postorder, inorder, n);
cout << "Preorder:";
DLR(T);
return 0;
}
BinTree BuildTree(int* post, int* in, int n)
{
if (n == 0)
return NULL;
else
{
int* mid = in;
while(*mid != *(post + n - 1))
mid++;

int m = mid - in; //找到树根的位置
BinTree T = new tree;
T->data = *mid;
T->left = BuildTree(post, in, m); //以后序和中序中前m个节点建立左子树
T->right = BuildTree(post + m, in + m + 1, n - m - 1);//建立T的右子树
return T;
}

}
void DLR(BinTree T)
{
if (T)
{
cout << " " << T->data;
DLR(T->left);
DLR(T->right);
}
}