算法训练 求先序排列(二叉树的建立)

  算法训练 求先序排列  
时间限制:1.0s   内存限制:256.0MB
       
问题描述
  给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入格式
  两行,每行一个字符串,分别表示中序和后序排列
输出格式
  一个字符串,表示所求先序排列

   样例输入
  BADC
  BDCA
样例输出
ABCD

 

对于中序和后序排列求前序序列,本来以为要通过建树来实现,发现并不是那么回事,可以通过一定的规律来实现

首先对于后序序列,最后一个肯定是最上面的根节点,那么在中序序列里面找到根节点的位置,然后根据根节点的位置来实现分别遍历左子树和右子树,对于左子树也是先通过后序列序列找到根节点的位置,然后对应中序序列的位置对应左子树和右子树

此题目的一个思考的地方是,关于后序序列中的根节点,如果一旦在中序序列中找出,便可以得到左子树和右子树的个数,从而得到进入下一个子树的里面的根节点

#include
#include
#define MAX 10

char mid[MAX],later[MAX];

void tree(int l,int r,int st,int ed)
{
	int temp=later[ed];
	if(l>r||st>ed)
	{
		return ;
	}
	else
	{
		printf("%c",temp);
		for(int i=l;i<=r;i++)
		{
			if(temp==mid[i])
			{
				tree(l,i-1,st,st+(i-1-l));
				tree(i+1,r,st+(i-l-1)+1,ed-1);
				return ;
			}
		}
	}
	return ;
}

int main()
{
	scanf("%s",mid);
	scanf("%s",later);
	int len=strlen(mid);
	tree(0,len-1,0,len-1);
	return 0;
}


你可能感兴趣的:(qdu_蓝桥经典习题)