解题思路:用双向链表进行模拟,为了能够快速找到每个序号对应的节点位置,用一个unordered_map<int,Node*>进行维护,代码如下:
#include<bits/stdc++.h>
#define MAX 100001
using namespace std;
struct Node
{
int data;
Node *right;
Node *left;
};
int n,m;
int visited[MAX];
unordered_map<int,Node*> mp;
Node* init()
{
Node *node = new Node;
node->data = 1;
node->left = node->right =NULL;
mp[1] = node;
return node;
}
void create(int cur,int index,int flag)
{
//cur是当前待插入值的序号,index是插入哪个序号的左边或者右边
Node *temp = new Node;
temp->data = cur;
temp->left=temp->right=NULL;
Node *t = mp[index];
if(flag==0)
{
temp->left = t->left;
t->left->right = temp;
temp->right = t;
t->left = temp;
}
else
{
if(t->right==NULL)
{
t->right=temp;
temp->left=t;
}
else
{
Node *p = t->right;
temp->left = t;
t->right=temp;
temp->right=p;
p->left = temp;
}
}
mp[cur]=temp;
}
void delete_node(int cur)
{
//删除当前节点
Node *temp = mp[cur];
if(temp->right==NULL)
{
temp->left->right=NULL;
}
else
{
temp->left->right = temp->right;
temp->right->left = temp->left;
}
}
int main()
{
cin>>n;
Node *head = new Node;//头节点
head->data=-1;
head->left = head->right = NULL;
Node *root = init();
head->right = root;
root->left = head;
int x,y;
for(int i=2;i<=n;i++)
{
cin>>x>>y;
create(i,x,y);
}
cin>>m;
for(int i=0;i<m;i++)
{
cin>>x;
if(!visited[x])
{
delete_node(x);
visited[x]=1;
}
}
Node *temp = head;
while(temp->right!=NULL)
{
cout<<temp->right->data<<" ";
temp = temp->right;
}
return 0;
}