以题目中给出得例子为例,通过后序遍历取最后一位可以得到当前子树的根节点为:A,然后到中序遍历里面取寻找这个根节点,从而可以通过中序遍历来将当前树分割成左子树和右子树。
然后递归重复这个过程就可以得到先序遍历。要注意递归的条件要l1>r1,因为在边界处可以会出现l1>r1的情况这时候要直接结束这一层递归。
#include <bits/stdc++.h> using namespace std; string zhong, hou; int len; void xian(int l1, int r1, int l2, int r2) { if (l1>r1) return; //由后序遍历的最后一位来确定当前子树的根节点 char root = hou[r2]; printf("%c", root); int pos; //通过根节点去中序遍历里面找分割点 for (pos=l1;pos<=r1;pos++) { if (zhong[pos]==root) break; } //先左后右的深入递归 xian(l1, pos-1, l2, l2+(pos-1-l1)); xian(pos+1, r1, l2+(pos-1-l1)+1, r2-1); } int main() { cin>>zhong>>hou; len = zhong.length(); //先中序后后序 xian(0, len-1, 0, len-1); return 0; }