洛谷 P1087 [NOIP2004 普及组] FBI 树

P1087 NOIP2004 普及组 FBI 树

菜鸟生成记(39)

思路: 构建二叉树,然后后序遍历(if套if)

#include<iostream>
using namespace std;
typedef struct st{//结点 
	string x;//数据域 
	struct st *r,*l;//指针域 ; 
}ll,*link;//类型名 
void create(link &t,string s)//创建二叉树(这里的树节点一定要用引用类型,不然改变不会回传主函数) 
{
	if(s.length()<=1)//字符串长度<=1,说明已经到达叶子结点了,开始返回 
	{
		t->x=s;//这个赋值不能少,因为长度为1的字符串substr不会再截取了 
		t->l=t->r=NULL;//叶子结点的左右孩子赋空(用于后序遍历判断叶子结点) 
		return;
	}
	else
	{//string截取子串函数:substr(start,len);
	//start:起始下标 len:截取长度
		string str;
		t->l=new ll;//左孩子分配空间 
		str=t->l->x=s.substr(0,s.length()/2);//截取左半 
		create(t->l,str);//创建左子树 
		t->r=new ll;//右孩子分配空间 
		str=t->r->x=s.substr(s.length()/2,s.length());//截取右半 
		create(t->r,str);//创建右子树 
	}
}
void find1(string s)//判断字符串的类型(F,B,I) 
{
	int num1,num0;
	num0=s.find("0");//查找字符串中是否有'0'(有:返回下标,没有: 返回-1) 
	num1=s.find("1");//查找字符串中是否有'1' 
	if(num0!=-1&&num1==-1)//只有0 
	cout<<'B';
	else if(num0==-1&&num1!=-1)//只有1 
	cout<<'I';
	else//有0又有1 
	cout<<'F';
}
void input(link t)//后序遍历二叉树 
{
	if(t)
	{
		input(t->l);
		input(t->r);
		find1(t->x);//判断后输出(F,B,I) 
	}
}
int main()
{
	int n;
	link t=new ll;//根节点分配空间 
	string s;
	cin>>n;
	cin>>s;
	t->x=s;//根节点数据域赋值 
	create(t,s);//创建二叉树 
	input(t);//后序遍历二叉树 
	return 0;
 } 

你可能感兴趣的:(二叉树,字符串,数据结构,算法)