本程序不创建树,采用递归直接输出深度。
思想:Depth函数输入的子串在中序串中的开始和结束位置,如果start==end,返回1,如果start>end, 返回0, 否则,在先序串中找到每个子树的root节点,然后分成两个子串,分别记录两个子串的start和end.
leftRoot 和 rightRoot 记录的是子串在前序串中的开始位置,也就是其根节点所在位置的下标。
```c
#include <stdio.h>
#include <stdlib.h>
#define MaxN 1000
/*
9
ABDFGHIEC
FDHGIBEAC
5
ABCDE
BADCE
*/
char Mid[MaxN] = {'\0'};
char Front[MaxN] = {'\0'};
int Depth(int start, int end, int startInFront);
int main()
{
int N = -1;
scanf("%d", &N);
scanf("%s", Front);
scanf("%s", Mid);
// printf("Front : %s\nMid : %s\n", Front, Mid);
int start = 0;
int end = N-1;
int depth = Depth(start, end, 0);
printf("%d", depth);
return 0;
}
int Depth(int start, int end, int startInFront) {
printf("start : %d -----end : %d\n", start, end);
if(start == end) {
printf("start == end break;");
return 1;
}
if(start > end) {
printf("start > end break;");
return 0;
}
else {
int leftStart, leftEnd, rightStart, rightEnd, max, d1, d2, rootLoc,
leftRoot, rightRoot;
leftStart = start;
rightEnd = end;
leftRoot = start +1;
/* 1 先在先序中寻找root, 然后去中序中确定数组长度和start,end */
char root = Front[startInFront];
for(int i=start; i<=end; i++) {
if ( Mid[i] == root ) {
rootLoc = i;
break;
}
}
printf("----root is : %c\n", root);
leftEnd = rootLoc - 1;
rightStart = rootLoc + 1;
rightRoot = startInFront + leftEnd + 2 - leftStart;
printf("leftRoot : %d------rightRoot : %d\n\n", leftRoot, rightRoot);
d1 = Depth(leftStart, leftEnd, leftRoot);
d2 = Depth(rightStart, rightEnd, rightRoot);
max = d1>d2?d1:d2;
return max+1;
}
}