居然一次性就AC了。。。。简直不敢相信
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤),是树中结点的个数。随后两行,每行给出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>
typedef int ElementType;
typedef struct tnode * position;
typedef position bintree;
struct tnode
{
ElementType data;
bintree left;
bintree right;
};
bintree recovTree(ElementType postorder[], ElementType inorder[], int length);
void preorderPrint(bintree btr);
int findXinArray(ElementType x, ElementType a[], int len);
bintree recovTree(ElementType postorder[], ElementType inorder[], int length)
{
bintree btr = NULL;
if(length>0)
/**< 当长度为0时,代表两个数组里已经没有元素了,二叉树里也没结点了,所以跳过下面代码直到return */
{
int separatePtr; /**< 记录中序数据中的分界点 */
btr = (bintree)malloc(sizeof(struct tnode));
btr->left = btr->right = NULL;
btr->data = postorder[length-1]; /**< 取后序数组中最后一个数,即为该结点数据 */
separatePtr = findXinArray(btr->data, inorder, length); /**< 找出中序数组中,本结点数据在数组中的位置 */
int leftLength = separatePtr; /**< 以分界点为界,中序数组左边为本结点左子树所有的元素,右边为右子树所有的元素 */
int rightLength = length - leftLength - 1;
if(leftLength>=0)
{
btr->left = recovTree(postorder, inorder, leftLength);
}
if(rightLength>=0)
{
btr->right = recovTree(&postorder[leftLength], &inorder[leftLength+1], rightLength);
}
}
return btr;
}
int findXinArray(ElementType x, ElementType a[], int len)
{
int cnt = -1;
int i;
for(i=0; i<len; i++)
{
if(x==a[i])
return i;
}
return cnt;
}
void preorderPrint(bintree btr)
{
if(btr)
{
printf(" %d", btr->data);
preorderPrint(btr->left);
preorderPrint(btr->right);
}
}
int main()
{
int num, i;
scanf("%d", &num);
ElementType a[num];
ElementType b[num];
for(i=0; i<num; i++)
{
scanf("%d", &a[i]);
}
for(i=0; i<num; i++)
{
scanf("%d", &b[i]);
}
bintree rlt = recovTree(a, b, num);
printf("Preorder:");
preorderPrint(rlt);
printf("\n");
system("pause");
}