求后序遍历

 

 这道题目可以用递归来解(不是正解)

思路如下:

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.散会!

posted @ 2022-09-03 22:27  王浩泽  阅读(75)  评论(0编辑  收藏  举报