列出叶节点 (二叉树的建立和BFS)

描述
阿伟在网吧玩一款叫做“逃离地下室”的密码游戏,游戏规则是这样的:

地下室有多层,编号为0,1,2,…,n(n<100)的房间分布在其中,所有房间都有1个下来的入口,最多有左右2个通往下一层房间的出口。
第一层只有一个房间,是阿伟的出发点,角色下来时的入口被电子密码锁锁住了。

游戏说明,往右边走将来会遇到的所有房间,都是往左走遇不到的,反过来也一样,在房间里的路径不会形成环。
阿伟离开地下室的密码,是所有没出口的房间编号的一个特殊排序,排序规则为:先输出距离地面近的房间号,距离相同时,先输出靠左侧的房间号。

密码正确阿伟就会回家,如果一直解不开,阿伟可能会因为没有网费,去陌生人杰哥的家里继续玩游戏。你是阿伟的好朋友阿斌,你不能很逊地看着朋友去陌生人家里,你决定写个代码帮他打开密码锁……

输入
第一行,为一个非负整数n,0≤n<100;
之后n+1行,代表从编号0开始的房间,对应的左右出口通往的房间号,若该方向无出口,则用 “*” 表示。

输出:
先输出距离地面近的房间号,距离相同时,先输出靠左侧的房间号。
密码不含任何空格!如房间为:5号 2号 0号,则“520”为密码。

样例输入

5
* *
5 *
* *
1 4
2 0
* *
样例输出
520
样例分析
列出叶节点 (二叉树的建立和BFS)_第1张图片
思路:根据题目描述及样例可以看出这是一个二叉树的广度优先搜索的题,我们选择用静态链表建立二叉树并用队列实现广度优先搜索;

代码

#include
using namespace std;

typedef unsigned long long ull;
typedef long long ll;

const ll maxx = 1e18;
const int N = 1e6+10;
const int p = 1e4;
const double eps = 1e-8;
//二叉树的层序遍历   //二叉树的建立 

int n,root1;
string a;//用字符串处理 "*" 和 "100" 不同的情况 
bool flag[1002]; //用来找树根 

int con(string s)
{
	int sum=0,len=s.size();
	
	for(int i=0;i<len;i++)
	{
		sum=sum*10+s[i]-'0';
	}
	
	return sum;
}//读入数字 

struct Tree1{
	int Lchild1;//左孩子 
	int Rchild1;//右孩子 
	int num;
}tree1[1002],le; 

queue<Tree1>qu;//队列存结构体 

int main()
{
	scanf("%d",&n);
	for(int i=0;i<=n;i++)//注意循环次数 
	{
		cin>>a; 
		 
		if(a=="*")
			tree1[i].Lchild1=-1;//用 -1 代表没有子节点 
		else
			tree1[i].Lchild1=con(a);//左孩子 
		
		cin>>a;
		if(a=="*")
			tree1[i].Rchild1=-1;
		else
			tree1[i].Rchild1=con(a);//右孩子 
		
		tree1[i].num=i;//标记好房间号 
		
	}//建立二叉树 
	
	
	for(int i=0;i<=n;i++)
	{
		flag[tree1[i].Lchild1]=true;
		flag[tree1[i].Rchild1]=true;
	}
	
	for(int i=0;i<=n;i++)
	{	
		if(flag[i]==0)
			root1=i;
	}//找树根,标记所有节点的子节点,没有被标记的唯一点即为树根 
	
	
	qu.push(tree1[root1]);//树根存入队列 
	
	while(!qu.empty())
	{
		le=qu.front();
		qu.pop();
		
		if(le.Lchild1==-1&&le.Rchild1==-1)
		{
			printf("%d",le.num);//cout<
		}//无子节点就输出 
		
		if(le.Lchild1!=-1)
		{
			qu.push(tree1[le.Lchild1]);
		}
		
		if(le.Rchild1!=-1)
		{
			qu.push(tree1[le.Rchild1]);
		}//有子节点优先在队尾存入左孩子,然后存入右孩子 
	}
	
	
	return 0; 
}

(觉得写得不错就给个小小的赞吧)

你可能感兴趣的:(c++,广度优先,数据结构)