5-23 还原二叉树 (25分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(
≤50
),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
思路
大致上是利用了先序和中序遍历机制。结合递归算法算出最深一层是第几层,也就是此二叉树的高度。
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
/* 评测结果
时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户
2016-08-30 09:15 答案正确 25 5-23 gcc 4 1 569985011
测试点结果
测试点 结果 得分/满分 用时(ms) 内存(MB)
测试点1 答案正确 12/12 4 1
测试点2 答案正确 3/3 1 1
测试点3 答案正确 3/3 1 1
测试点4 答案正确 1/1 1 1
测试点5 答案正确 6/6 1 1
查看代码*/
char* ReadData(const int number);
int Found(char );
int Function(int ,int);
char *preorder;
char *inorder;
int Usedorder[51];
int main() {
int n;
scanf("%d",&n);
preorder=ReadData(n);
inorder=ReadData(n);
for(int i=0; i<n; i++) {
Usedorder[i]=0;
}
printf("%d",Function(0,n-1));
return 0;
}
int Function(int left,int right) {
//printf("%d-%d",left,right);
if(left<right) {
int index=Found(preorder[left]);
if(index==-1) {
printf("ERROR!\n");
return -999;
}
Usedorder[index]=1;
int LeftSon=0;
for(int j=index-1; j>=0; j--) {
if(Usedorder[j])break;
LeftSon++;
}
// printf("{");
// for(int i=left; i<=right; i++) {
// if(i==left+LeftSon)printf("|");
// printf("%c",inorder[i]);
// if(i==left+LeftSon)printf("|");
// }
// printf("}\n");
int leftTree=Function(left+1,left+LeftSon);
// printf("|");
int rightTree=Function(left+1+LeftSon,right);
// printf("\n");
return (leftTree>rightTree?leftTree:rightTree)+1;
}
return 1;
}
char* ReadData(const int n) {
getchar();
char *a=(char*)malloc(sizeof(char)*51);
for(int i=0; i<n; i++) {
scanf("%c",&a[i]);
}
a[n]='\0';
// printf("ReadData{");
// for(int i=0; i<strlen(a); i++)printf("%c",a[i]);
// printf("}\n");
return a;
}
int Found(char a) {
for(int i=0; i<strlen(inorder); i++) {
if(inorder[i]==a)return i;
}
return -1;
}