本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出Preorder: 以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
1.建树-储存-先序访问
#include<stdio.h>
#include <stdlib.h>
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
int Data;
BinTree Left;
BinTree Right;
};
BinTree CreatTree(int a[],int b[],int n)
{
BinTree T=NULL;
if(n>0)
{
int i;
T=(BinTree)malloc(sizeof(struct TreeNode));
T->Left=T->Right=NULL;
T->Data=a[n-1];
for(i=0;i<n;i++)
if(T->Data==b[i])
break;
int right_n=n-1-i;
int left_n=i;
if(right_n>=0)
T->Right=CreatTree(&a[left_n],&b[left_n+1],right_n);
if(left_n>=0)
T->Left=CreatTree(a,b,left_n);
}
return T;
}
void PrintPreTraversal(BinTree BT)
{
if(BT)
{
printf(" %d",BT->Data);
PrintPreTraversal(BT->Left);
PrintPreTraversal(BT->Right);
}
}
int main()
{
BinTree T;
int n,post_a[30],in_a[30];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&post_a[i]);
for(int i=0;i<n;i++)
scanf("%d",&in_a[i]);
printf("Preorder:");
T=CreatTree(post_a,in_a,n);
PrintPreTraversal(T);
return 0;
}
2.数组存储-直接输出
#include<stdio.h>
int solve(int *post,int *in,int n)
{
int i,L,R,root;
if(n==0) return;
if(n==1) root=post[0];
root=post[n-1];
printf(" %d",root);
for(i=0;i<n;i++)
if(root==in[i])
break;
L=i;R=n-1-i;
solve(post,in,L); //左树查找
solve(&post[L],&in[L+1],R); //右树查找
return;
}
int main()
{
int i,n,post_a[30],in_a[30];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&post_a[i]);
for(i=0;i<n;i++)
scanf("%d",&in_a[i]);
printf("Preorder:");
solve(post_a,in_a,n);
return 0;
}