绘制地图


题目要求 给出二叉树的前序和中序要求求出后序序列,序列长度为N N<=100000

解题思路

可以用结构体模拟二叉树,代码较长而且费时,也可以通过dfs求解,本篇采用dfs,具体为什么,可以采用样例模拟的方式代入。
····
al在先序中是根root,要在中序中找到b[i]=al的点,i的左边就是左子树,右边是右子树,子树节点的长度al,ar或bl,br
在先序序列中左子树区间为 [al+1,al+j-bl],中序序列左子树区间为[bl,j-1]
在先序序列中右子树区间为[al+j-bl+1,ar],中序序列右子树区间为[j+1,br]
通过观察先序和中序的左右子树区间,可知al为先序的rootj为中序的根。

code

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
const int N=100010;
int a[N],b[N];
void fun(int a_l,int a_r,int b_l,int b_r){

    for(int j=b_l;j<=b_r;j++){
        if(a[a_l]==b[j]){
		fun(a_l+1,a_l+j-b_l,b_l,j-1);//遍历左子树
		fun(a_l+j-b_l+1,a_r,j+1,b_r);//遍历右子树
//            printf("%d ",b[j]);//后序遍历,所有最后输出节点
            break;
        }
    }
}
int main()
{
  int n;
  cin>>n;
	for(int i=0;i<n;i++)cin>>a[i];//前序序列
	for(int i=0;i<n;i++)cin>>b[i];//后序序列
	fun(0,n-1,0,n-1);
	
    return 0;
}