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

简介: 列出叶节点 (二叉树的建立和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
* *
样例输出
520
样例分析
0311c444e758e267b0450e0d6de68738_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBALkFzaHku,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center.png



思路:根据题目描述及样例可以看出这是一个二叉树的广度优先搜索的题,我们选择用静态链表建立二叉树并用队列实现广度优先搜索;

代码


#include<bits/stdc++.h>
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<<le.num; 
  }//无子节点就输出 
  if(le.Lchild1!=-1)
  {
    qu.push(tree1[le.Lchild1]);
  }
  if(le.Rchild1!=-1)
  {
    qu.push(tree1[le.Rchild1]);
  }//有子节点优先在队尾存入左孩子,然后存入右孩子 
  }
  return 0; 
}


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


目录
相关文章
|
3天前
|
算法 C++ 开发者
【C/C++ 数据结构 】二叉树基本性质:对于任何一颗二叉树T,若其终端结点为n0 ,那么度数为2的结点数为n2。则n0=n2+1...
【C/C++ 数据结构 】二叉树基本性质:对于任何一颗二叉树T,若其终端结点为n0 ,那么度数为2的结点数为n2。则n0=n2+1...
19 0
|
7月前
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】
23 0
|
3天前
|
存储
二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
|
10月前
L2-026 小字辈(树的建立+BFS)
L2-026 小字辈(树的建立+BFS)
46 0
计算左子树规模(结点个数),找出树的根结点
简单的计算公式教你找出左子树到底有多少个娃,也会与你一起寻找根结点,快来看看呀
计算左子树规模(结点个数),找出树的根结点
|
10月前
|
算法
【数据结构与算法】二叉树的深度,节点数,第k层的节点数,遍历,二叉树叶节点的个数
【数据结构与算法】二叉树的深度,节点数,第k层的节点数,遍历,二叉树叶节点的个数
129 0
|
12月前
二叉树的前中后序遍历以及求深度、叶子节点和二叉树的重建
二叉树的前中后序遍历以及求深度、叶子节点和二叉树的重建
47 0
二叉树的层序遍历、二叉树叶节点输出算法、求二叉树的高度、层序创建一棵二叉树
二叉树的层序遍历、二叉树叶节点输出算法、求二叉树的高度、层序创建一棵二叉树
|
存储 JavaScript 前端开发
在二叉树中找到一个节点的后继节点
在二叉树中找到一个节点的后继节点
124 0