求后序遍历
这道题目可以用递归来解(不是正解)
思路如下:
1.输入
2.递归
2.1判断是否合法 return
2.2判断是否只有一个数 输出,return
2.3根节点是前序遍历的首节点,再在中序遍历中找到根节点的位置,找到位置之后就可以把中序遍历和前序遍历分成左子树和右子树
2.4进入下一层(分治,一个是对于当前的左子树 一个右子树,先左后右)
2.5输出根节点,遵循左右根的后序遍历要求
3.例程:
#include<bits/stdc++.h> using namespace std; const int N=1e4+10; int n,a[N]={0},b[N]={0}; void d(int l1,int r1,int l2,int r2) { if(l1>r1) return; if(l1==r1) { cout<<a[l1]<<' '; return; } int root=a[l1],p=0; for(int i=l2;i<=r2;i++) { if(b[i]==root) { p=i; break; } } int llen=p-l2,rlen=r2-p; //前序遍历左 l1+1 ~ l1+llen // 右 r1-rlen+1 ~ r1 //中序遍历左 l2 ~ p-1 // 右 p+1 ~ r2 d(l1+1,l1+llen,l2,p-1); d(r1-rlen+1,r1,p+1,r2); cout<<root<<' '; } int main() { #ifdef LOCAL freopen("1.in", "r", stdin); freopen("1.out", "w", stdout); #endif scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); d(1,n,1,n); return 0; }
4.散会!