給一棵樹的先序遍歷和中序遍歷如下:
先序遍歷: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; }
你不勇敢,沒人替你堅強!