本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的前序遍历结果。
输入格式:
第一行给出正整数 n (≤30),是树中结点的个数。随后两行,每行给出 n 个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出Preorder:
以及该树的前序遍历结果。数字间有1个空格,行末不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
Preorder: 4 1 3 2 6 5 7
#include<stdio.h>
#include<stdlib.h>
#define MAXN 30
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType data;
BinTree left;
BinTree right;
};
BinTree buildTree(int inorder[],int postorder[],int n);
void preorderTraversal(BinTree bt);
int main(){
BinTree t;
int inorder[MAXN],postorder[MAXN],n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&postorder[i]);
for(i=0;i<n;i++)
scanf("%d",&inorder[i]);
t=buildTree(inorder,postorder,n);
printf("Preorder:");
preorderTraversal(t);
return 0;
}
BinTree buildTree(int inorder[],int postorder[],int n)
{
BinTree t;
int p;
if(!n)
return NULL;
t=(BinTree)malloc(sizeof(struct TNode));
t->data=postorder[n-1];//根节点是后续最后一个
t->left=t->right=NULL;
for(p=0;p<n;p++)//在中序里找根节点
if(inorder[p]==postorder[n-1])
break;
//左右子树分别有p和n-p-1个节点
t->left=buildTree(inorder,postorder,p);
//右子树中序和后序遍历的起始地址 要跳过左子树和p根节点的位置
//类似1234 p 5678
t->right=buildTree(inorder+p+1,postorder+p,n-p-1);
return t;
}
void preorderTraversal(BinTree t)
{
if(t){
printf(" %d",t->data);
preorderTraversal(t->left);
preorderTraversal(t->right);
}
}