hdu1710 Binary Tree Traversals

        题意:给出二叉树的先序和中序遍历,输出它的后序遍历。

        思路:对于每个子树,先序的第一个节点肯定是根节点。我们可以在中序中找到这个根节点,该节点左边的长度就是根的左子树的大小,右边同理。然后递归左右子树就可以了。


#include <iostream>             
#include <stdio.h>             
#include <cmath>             
#include <algorithm>             
#include <iomanip>             
#include <cstdlib>             
#include <string>             
#include <memory.h>             
#include <vector>             
#include <queue>             
#include <stack>             
#include <map>           
#include <set>           
#include <ctype.h>

#define ll long long         
#define max3(a,b,c) max(a,max(b,c))         
#define MAXN 4100000  
    
using namespace std;    

int pre[1010];
int in[1010];
int post[1010];

int n;
int m;

void fun(int start,int end,int* arr){
	if(start>end)return ;
	if(start==end){
		post[++m]=pre[start];return;
	}
	int root=pre[start];
	int k=0;
	while(1){
		if(arr[k]==pre[start])break;
		k++;
	}
	fun(start+1,start+k,arr);
	fun(start+k+1,end,arr+k+1);
	post[++m]=pre[start];
}


int main(){
	
	while(cin>>n){
		m=0;
		for(int i=1;i<=n;i++){
			scanf("%d",&pre[i]);
		}
		for(int i=1;i<=n;i++){
			scanf("%d",&in[i]);
		}
		
		fun(1,n,in+1);
		for(int i=1;i<=n;i++){
			printf("%d",post[i]);
			if(i!=n)printf(" ");
		}
		printf("\n");
	}
	return 0;
}


你可能感兴趣的:(二叉树的遍历)