zoukankan      html  css  js  c++  java
  • FBI树

    题目描述

    我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

    FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

    1) T的根结点为R,其类型与串S的类型相同;

    2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

    现在给定一个长度为2^N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

    输入输出格式

    输入格式:

    第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2^N的“01”串。

    输出格式:

    包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    bool x[2000];
    int y[5000],a,b,c,d,e,f,g,m,n,k,cnt,bnt,dnt,mmp;
    char z,z1[20];
    int cot(int p)
    {
    	if(y[p]==3)
    	{
    		cout<<"F";
    	}
    	if(y[p]==2)
    	{
    		cout<<"I";
    	}
    	if(y[p]==1)
    	{
    		cout<<"B";
    	}
    }
    int  print(int l)
    {
    	 if(mmp==g)
    	 {
    	 	return 0;
    	 }
    	 if(y[l*2]==0)
    	 {
    	 	cot(l);
    	 	mmp++;
    	 	y[l]=0;
    	 	if(l%2==0)
    	 	{
    	 		print(l+1);
    	 	}
    	 	else
    	 	{
    	 		print(l/2);
    	 	}
    	 }
    	 else
    	 {
    	 	print(l*2);
    	 }
    }
    int main()
    {
    	cin>>m;
    	n=1;
    	k=1;
    	for(a=1;a<=m;a++)
    	{
    		n=n*2;
    		k=k+n;
    	}	
    	g=k;
    	f=n;
    	for(a=1;a<=n;a++)
    	{
    		cin>>z;
    		if(z=='0')
    		{
    			x[a]=0;
    		}
    		else
    		{
    			x[a]=1;
    		}
    	}
    	
    //	for(a=1;a<=n;a++)
    //	{
    //		cout<<x[a];
    //	}
    	for(a=1;a<=n;a++)
    	{
    		if(x[a]==1)
    		{
    			cnt=1;
    		}
    		else
    		{
    			bnt=1;
    		}
    	}
    	
    	if(cnt==1&&bnt==1)
    	{
    		y[1]=3;
    	}
    	else
    	{
    		if(cnt==1)
    		{
    			for(a=1;a<=k;a++)
    			{
    				cout<<"I";
    			}	
    			return 0;
    		}
    		if(bnt==1)
    		{
    			for(a=1;a<=k;a++)
    			{
    				cout<<"B";
    			}	
    			return 0;
    		}
    	}
    	cnt=0;
    	bnt=0;
    	dnt++;
    	
    //	g=n;
    	for(a=1;a<=m;a++)
    	{
    		n=n/2;
    		k=f/n;
    		for(b=1;b<=k;b++)
    		{
    			for(c=(b-1)*n+1;c<=n*b;c++)
    			{
    				if(x[c]==1)
    				{
    					cnt=1;
    				}
    				else
    				{
    					bnt=1;
    				}
    			}
    			dnt++;
    			if(cnt==1&&bnt==1)
    			{
    				y[dnt]=3;
    			}
    			else
    			{
    				if(cnt==1)
    				{
    					y[dnt]=2;
    				}
    				if(bnt==1)
    				{
    					y[dnt]=1;
    				}
    			}
    			cnt=0;
    			bnt=0;
    		}
    	}
    	
    	n=f/2;
    	print(n);
    	return 0;
    //	gets(z1);
    //	for(a=1;a<=g;a++)
    //	{
    //		if(y[a]==3)
    //		{
    //			cout<<"F";
    //		}
    //		if(y[a]==2)
    //		{
    //			cout<<"I";
    //		}
    //		if(y[a]==1)
    //		{
    //			cout<<"B";
    //		}
    //	}
    //	system("pause");
    	return 0;
    	
    }


  • 相关阅读:
    thinkphp 前后端分离
    git常用命令总结
    DIV常用属性大全
    shell编程学习之使用jq对json数据进行提取
    shell编程之if语句
    shell编程之变量赋值
    【总结】sqli-labs Less(1-35) 小结
    【总结】sqlmap常用命令
    【总结】kali(amd64)中安装nessus
    【总结】ettercap工具之DNS劫持
  • 原文地址:https://www.cnblogs.com/ztz11/p/9189982.html
Copyright © 2011-2022 走看看