原题链接
这道题就是给定一棵树,然后层序遍历。怎么层序遍历呢?一层一层的就很想队列。所以使用队列做这道题。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
/*int num[10005];
int main()
{
int n;
cin >> n;
for(int i = 1; i<= n;i++)
cin >> num[i];
int sum = 0, maxsum = 0, end_ = 0,st = 0, flag = 0;
for(int i = 1;i <= n;i++)
{
sum += num[i];
if(sum < 0)
sum = 0;///重新开始
if(sum>maxsum)///要求索引值最小,所以不用加等于也不用考虑123000后面的零
{
maxsum = sum;
end_ = i;
}
if(num[i]>=0)
flag = 1;///看是不是全为负
}
sum = 0;
for(int i = end_;i >= 1;i--)
{
sum = sum + num[i];
if(sum == maxsum)
st = i;
}
if(!flag)
printf("0 %d %d",num[1], num[n]);
else
printf("%d %d %d",maxsum, num[st], num[end_]);
}
*/
/*struct Node{
int key, next, before;
}node[100005];
int st[100005], head;
int main()
{
int n, k, before = -3,temp;cin >> head >> n >> k;
for(int i = 1;i <= n;i++)
{
cin >> temp;
cin>>node[temp].key>>node[temp].next;
node[temp].before = before;
}
int cntk = 0, cnt = 0, latthead = -2;
for(int i = head;i!=-1;i = node[i].next)
{
node[i].before = before;
before = i;
}
for(int i = head;i!=-1;i = node[i].next)
{
cntk++;
if(cntk==k)
{
st[++cnt] = i;
cntk = 0;
continue;
}
if(n - cnt*k < k){latthead = i;break;}
}
for(int i = 1; i <= cnt ;i++)
{
printf("%05d %d ",st[i],node[st[i]].key);
for(int j = node[st[i]].before, m = 1;m < k; m++, j = node[j].before)
{
printf("%05d\n%05d %d ",j, j, node[j].key);
}
if(i != cnt)printf("%05d\n",st[i+1]);
else if(i == cnt&&latthead == -2)cout << -1;
else printf("%05d\n",latthead);
}
/// system("pause");
if(latthead != -2)
{
printf("%05d %d ",latthead, node[latthead].key);
for(int i = node[latthead].next; i != -1 ;i = node[i].next)
{
printf("%05d\n%05d %d ",i, i, node[i].key);
}
cout << -1;
}
}*////最后一个没过
/*int main()
{
int num[1005];
stack<int>s;
int m, n, k;
cin >> m >> n >> k;
for(int i = 1;i <= k;i++)
{
int temp = 1, cap = 0;
for(int j = 1;j <= n;j++)
{
cin >> num[j];
if(temp>n)break;
while(temp<=num[j]&&cap<=m)
{
s.push(temp);
cap++;
temp++;
}
if(temp>num[j])
{
int t;
t = s.top();
if(t>=num[j]&&!s.empty())
s.pop();
}
if(temp)
}
}
}*/
/*int main()
{
int maxcapacity, maxnum, n, cnt;bool flag = 0;
cin >> maxcapacity >> maxnum >> n;
int num[1005];
for(int i = 1;i <= n;i++)
{
cnt = 1, flag = 0;
for(int j = 1;j <= maxnum;j++)
cin >> num[j];
stack<int>s;
for(int j = 0; j < maxnum;j++)
{
s.push(j+1);
if(s.size()>maxcapacity)
{
flag = 1;
break;
}
while(!s.empty()&&num[cnt] == s.top())
{
s.pop();
cnt++;
}
}
if(flag)cout << "NO";
else if(s.empty())cout <<"YES";
else cout << "NO";
if(i!=n)
cout <<endl;
}
}*/
/*int flag[20];
struct Node
{
int l, r, son;char e;
}node1[20], node2[20];
int buildtree(struct Node *node)
{
memset(flag,0,sizeof(flag));
int n, root = -1;
cin>>n;getchar();
if(!n)return -1;
for(int i = 0;i < n;i++)
{
string s;
getline(cin,s);
node[i].e = s[0];
if(s[2] == '-')
node[i].l = -1;
else
node[i].l = s[2]-'0';
if(s[4] == '-')
node[i].r = -1;
else
node[i].r = s[4]-'0';
if(s[2] != '-')
flag[s[2]-'0'] = 1;
if(s[4] != '-')
flag[s[4]-'0'] = 1;
if(node[i].l == -1 && node[i].r == -1)node[i].son = 0;
else if(node[i].l != -1&&node[i].r != -1)node[i].son = 2;///可判断同构
else node[i].son = 1;
}
for(int i = 0;i < n;i++)
if(!flag[i])
{
root = i;
break;
}
return root;
}
bool judge_(int r1, int r2)
{
if(r1 == -1&&r2 == -1)
return 1;
if((r1 == -1&&r2 != -1)||(r1 != -1&&r2 == -1))
return 0;
if(node1[r1].e != node2[r2].e)
return 0;///边界条件和判定
///if(node1[r1].son != node2[r2].son)
/// return 0;这个是可以没有的说明下面的最重要
return (judge_(node1[r1].l,node2[r2].l)&&judge_(node1[r1].r,node2[r2].r)||judge_(node1[r1].l,node2[r2].r)&&judge_(node1[r1].r,node2[r2].l));
}
int main()
{
int r1, r2;
r1 = buildtree(node1);
r2 = buildtree(node2);
if(judge_(r1, r2))
cout << "Yes";
else
cout <<"No";
}
int flag[20], parent1[20], parent2[20];
struct Node
{
int l, r;char e;
}node1[20], node2[20];
int buildtree(struct Node *node, int* parent)
{
memset(flag,0,sizeof(flag));
int n, root = -1;
cin>>n;getchar();
if(!n)return -1;
for(int i = 0;i < n;i++)
{
string s;
getline(cin,s);
node[i].e = s[0];
if(s[2] == '-')
node[i].l = -1;
else
{
node[i].l = s[2]-'0';
parent[node[i].l] = i;
}
if(s[4] == '-')
node[i].r = -1;
else
{
node[i].r = s[4]-'0';
parent[node[i].r] = i;
}
if(s[2] != '-')
flag[s[2]-'0'] = 1;
if(s[4] != '-')
flag[s[4]-'0'] = 1;
}
for(int i = 0;i < n;i++)
if(!flag[i])
{
root = i;
break;
}
return root;
}
void findparent(int r1)
{
}
bool judge_(int r1, int r2)
{
if(r1 == -1&&r2 == -1)
return 1;
if((r1 == -1&&r2 != -1)||(r1 != -1&&r2 == -1))
return 0;
if(node1[r1].e != node2[r2].e)
return 0;///边界条件和判定
///if(node1[r1].son != node2[r2].son)
/// return 0;这个是可以没有的说明下面的最重要
return (judge_(node1[r1].l,node2[r2].l)&&judge_(node1[r1].r,node2[r2].r)||judge_(node1[r1].l,node2[r2].r)&&judge_(node1[r1].r,node2[r2].l));
}
int main()
{
for(int i = 0;i < 20;i++)
{
parent1[i] = -2;
parent1[i] = -2;
}
int r1, r2;
r1 = buildtree(node1, parent1);
r2 = buildtree(node2, parent2);
findparent1(r1);
findparent2(r2);
if(judge_(r1, r2))
cout << "Yes";
else
cout <<"No";
}*/
struct Node
{
int l, r;
}node[25];
int flag[25];
int buildtree()
{
int n;
cin >> n;
for(int i = 0; i < n;i++ )
{
getchar();
char l, r;
scanf("%c %c",&l, &r);
if(l!='-')
{
node[i].l = l-'0';
flag[l-'0'] = 1;
}
else node[i].l = -1;
if(r!='-')
{
node[i].r = r-'0';
flag[r-'0'] = 1;
}
else node[i].r = -1;
}
for(int i = 0;i < n;i++)
{
if(!flag[i])
return i;///根节点
}
}
void judge(int root)
{
queue<int>q;
q.push(root);///从根开始向下搜
int z = 0;///标记空格
while(!q.empty())
{
int temp = q.front();q.pop();
if(node[temp].l == -1&&node[temp].r == -1)
{
if(!z)
{
cout << temp;
z=1;
}
else
cout <<' '<< temp;
}
if(node[temp].l!=-1)
q.push(node[temp].l);///先左后右
if(node[temp].r!=-1)
q.push(node[temp].r);
}
}
int main()
{
int r;
r = buildtree();
judge(r);
}