1. 程式人生 > >已知中序遍歷和先序遍歷求後序遍歷

已知中序遍歷和先序遍歷求後序遍歷

  給一棵樹的先序遍歷和中序遍歷如下:

先序遍歷:ABCDEFGHI

後序遍歷:CEDFBAHGI

後序遍歷結果:EFDCBHIGA

首,先序遍歷的過程為根-左-右,中序遍歷的過程為左-根-中,後序遍歷的過程為 左-右-根

由先序遍歷過程可知先序遍歷最開始的都是根,所以可以由先序遍歷的根對應中序遍歷中的根從而在中序遍歷中對樹進行劃分。

劃分結果

先序遍歷的根: 

A B C D E F G H I

    

下面是遞迴求解的過程,過程中注意每一個子區間代表一課子樹,在判斷子樹根的位置時要考慮這棵子樹是否有左子樹或者右子樹,對沒有的情況要特判

#include<stdio.h>
#include<cstring>
#pragma warning(disable:4996)
#define maxn 100000
using namespace std;
char s1[maxn];
char s2[maxn];
void dfs(char root, int pos, int l, int r)
{
    if (r - l <= 1)
    {
        if(root != ' ')
        printf("%c", root);
        return;
    }
    for (int i = l; i < r; i++)
    {
        if (s2[i] == root)
        {
            char t = pos + 1 < strlen(s1)&&i !=l ? s1[pos + 1] : ' ';//i == l 沒有左子樹
            dfs(t, pos + 1, l, i);
            t = pos + 1 + i - l < strlen(s1)&&i!=r-1 ? s1[pos + 1 + i - l] : ' ';//i= r-1沒有右子樹
            dfs(t, pos + 1 + i - l, i+1, r);
            printf("%c", root);
        }
    }


}
int main()
{
    scanf("%s%s",s1,s2);
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    char root = s1[0];
    dfs(root, 0, 0, len2);
    getchar();
    getchar();
    return 0;
}

 

 你不勇敢,沒人替你堅