题解 luogu P1087 【FBI树】

蒟蒻花了一个下午才A我同桌大佬5分钟A的水题。。。

首先是建树,建树流程为:

根据已给数据向上递归建树,题目数据是10001011,最下一层也就是IBBBIBII。向上递归,若左子树不等于右子树,父亲为’F’。反之,父亲左子树右子树。

我是用数组保存的树。递归过程为从最后一项(2^n)*2-1往前递归,每次递归由树数组的当前项(a[i])和前一项a[i-1]判断它的父亲a[i/2]是什么(二叉树的性质)

然后遍历。

#include
using namespace std;
char c[55555];
int g=0;
int l=1,n,i;
struct tree
{
	char data;
	int lchild,rchild;
}a[5100];//定义树
void make_tree()
{
	int j;
	j=i;
	while (j>=1)//到了根前停止
	{
		a[j/2].lchild=j-1;a[j/2].rchild=j;
		if (a[j].data!=a[j-1].data){a[j/2].data='F';}//按前面说的,父亲的两个儿子判断父亲是什么。
		else {a[j/2].data=a[j].data;}
        j-=2;//继续向前递归
	}
}
void writeln(int b)
{
	if (b)
	{
		writeln(a[b].lchild);
		writeln(a[b].rchild);
		cout<>n;
    for (i=1;i<=(1<>c[i];
    for (i=(1<=(1<

求通过,谢谢。

你可能感兴趣的:(题解 luogu P1087 【FBI树】)