#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
typedef struct Tree
{
int depth;
string name;
Tree* fa;
Tree* son;
Tree* bro;
}Tree;
Tree* company = new Tree;
Tree* sear;
int flag;
void Clear(Tree* p,int depth)
{
p->bro = NULL;
p->fa = NULL;
p->son = NULL;
p->depth = depth;
}
void Search2(Tree* node,string employer)//先序遍历
{
if (flag == 1) return;
if (node != NULL) {
if (node->name == employer) {
sear = node; flag = 1;
}
Search2(node->son,employer);
Search2(node->bro,employer);
}
}
Tree* Search(string employer)//初始化search指针,再用Search()全部遍历(时间可能有点可惜,不过怎么才能中途停止递归呢?flag就可以)
{
flag = 0;//还没找到
sear = NULL;
Search2(company,employer);
return sear;
}
void Hire(string employer,string staff)
{
Tree* nodee = Search(employer);
Tree* nodes = new Tree;
Clear(nodes, nodee->depth + 1);
Tree* node2;//第三种情况用来记录上一个bro
Tree* node = nodee->son;
nodes->fa = nodee;
//nodes->depth = nodee->depth + 1;
nodes->name = staff;
if (node == NULL) {//分三种情况 1ee无子 2ee只有一个儿子 3ee有多子(es有兄弟)
nodee->son = nodes;
}
else if (node->bro == NULL) {
node->bro = nodes;
}
else {
node2 = node;
node = node->bro;
while (node != NULL) {
node = node->bro;
node2 = node2->bro;
}
node2->bro = nodes;
}
}
void Fire(string staff)
{
Tree* node = Search(staff);
Tree* node2;
if (node->son == NULL && node->bro == NULL) {//三种情况 1无子无兄弟 2无子有兄弟 3有子
node2 = node->fa->son;//还是得从父亲那里遍历过去,它只是在边缘,上面可能还有兄弟(父亲可能不止一个儿子),不可直接剪son!
node = node2->bro;
while (node != NULL && node->bro != NULL) {
node = node->bro;
node2 = node2->bro;
}
if (node == NULL) node2->fa->son = NULL;//父亲只有一子
else node2->bro = NULL;//父亲多子
}
else if (node->son ==NULL) {
node2 = node->fa->son;//还是得从父亲那里遍历过去,它只是在正下或中间
node = node2->bro;
while (node2->name != staff && node->name != staff) {
node = node->bro;
node2 = node2->bro;
}
if (node->name == staff) node2->bro = node->bro;
else if (node2->name == staff) node2->fa->son = node;
}
else {
node2 = node;
node = node->son;
while (node != NULL) {
node2->name = node->name;
node2 = node2->son;
node = node->son;
}
node2->fa->son = node2->bro;
}
}
void Print(Tree* node)
{
if (node != NULL) {
for (int i = 1; i <= node->depth; i++) {
cout << '+';
}
cout << node->name << endl;
Print(node->son);
Print(node->bro);
}
}
int main()
{
string name, op, employer, staff;
Clear(company,0);
cin >> name;
company->name = name;
while(cin >> employer) {
if (employer != "print") {
if (employer != "fire") {//hires
cin >> op >> staff;
Hire(employer,staff);
}
else {//fire
cin >> staff;
Fire(staff);
}
}
else {
Print(company);
printf("------------------------------------------------------------\n");
}
}
}