1303 后续遍历

 
描述

在数据结构中,遍历是二叉树最重要的操作之一。所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。

这里给出三种遍历算法。

1.中序遍历的递归算法定义:
 若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)访问根结点;
(3)遍历右子树。

2.前序遍历的递归算法定义:
 若二叉树非空,则依次执行如下操作:
(1) 访问根结点;
(2) 遍历左子树;
(3) 遍历右子树。

3.后序遍历得递归算法定义:
 若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)遍历右子树;
(3)访问根结点。
现在给出一个二叉树的中序遍历和前序遍历。求它的后序遍历。

样例中的二叉树如下:

1303 后续遍历_第1张图片

     a                      x
   /   \                  /   \
  b     c               n     u
 / \   /               /  \
d   e f               l    i
   /
  g

输入

输入有多组数据,第一行有一个整数n,表示有n组数据。每组数据两行,每行均是由a-z的字符组成的字符串,每个字母表示一个结点。其顺序,分别为树的中序遍历和前序遍历。长度小于27.

输出

对于每组数据,输出一行,树的后序遍历。

样例输入
2
dbgeafc
abdegcf
lnixu
xnliu
样例输出
dgebfca
linux

 

经典的后续遍历算法

#include <stdio.h>
#include <string.h>
int find(char c,char A[],int s,int e) /**//* 找出中序中根的位置。 */
{
	int i;
	for(i=s;i<=e;i++)
		if(A[i]==c) return i;
}
/**//* 其中pre[]表示先序序,pre_s为先序的起始位置,pre_e为先序的终止位置。 */
/**//* 其中in[]表示中序,in_s为中序的起始位置,in_e为中序的终止位置。 */
/**//* pronum()求出pre[pre_s~pre_e]、in[in_s~in_e]构成的后序序列。 */
void pronum(char pre[],int pre_s,int pre_e,char in[],int in_s,int in_e)
{
	char c;
	int k;
	if(in_s>in_e)    return ;                 /**//* 非法子树,完成。 */
	if(in_s==in_e){printf("%c",in[in_s]); /**//* 子树子仅为一个节点时直接输出并完成。 */
	return ;
	}
	c=pre[pre_s];                           /**//* c储存根节点。 */
	k=find(c,in,in_s,in_e);                 /**//* 在中序中找出根节点的位置。 */
	pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1); /**//* 递归求解分割的左子树。 */
	pronum(pre,pre_s+k-in_s+1,pre_e,in,k+1,in_e); /**//* 递归求解分割的右子树。 */
	printf("%c",c);                         /**//* 根节点输出。 */
}
main()
{  
	int number;
	char pre[1000];
	char in[1000];
	scanf("%d",&number);
	while(number--)
	{
		scanf("%s",&in);

		scanf("%s",&pre);
	
	

	pronum(pre,0,strlen(in)-1,in,0,strlen(pre)-1);
	printf("\n");

}
} 


 

你可能感兴趣的:(1303 后续遍历)