题目:
分析:我本来是想用vector来进行模拟的,做之前看了一下答案,
啊,就是一个中序遍历的二叉树啊。
我真是个弱鸡。
注意,1的左边,还可以有再站到左边,因此,要注意结点的更新,子节点之后不一定是子节点了。
代码:
#include<bits/stdc++.h>
using namespace std;
int m,n;
int A[100005][2];
int B[100005];
queue<int> q;
void f(int x)
{
if(A[x][0]!=-1)
{
f(A[x][0]);
}
if(B[x]==0)
q.push(x);
if(A[x][1]!=-1)
{
f(A[x][1]);
}
}
int main()
{
memset(A,-1,sizeof(A));
cin>>m;
for(int i=2;i<=m;i++)
{
int a,b;
cin>>a>>b;
if(b==0)
{
A[i][0]=A[a][0];
A[a][0]=i;
}
else{
A[i][1]=A[a][1];
A[a][1]=i;
}
}
memset(B,0,sizeof(B));
cin>>n;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
B[a]=1;
}
f(1);
cout<<q.front();
q.pop();
while(!q.empty())
{
cout<<' '<<q.front();
q.pop();
}
}