7-3 还原二叉树 (25 分)--前序输出和中序输出确定唯一的树(递归算法)

在这里插入图片描述本程序不创建树,采用递归直接输出深度。
思想: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;
    }
}

Guess you like

Origin blog.csdn.net/ahao6666666/article/details/117530009