You are on page 1of 3

#include <algorithm>

#include <iostream>
#include <cmath>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <queue>
#include <deque>
#include <stack>
#include <ctime>
#include <iomanip>
#include <cstdlib>
#define F first
#define S second
#define TASK "j4f"
#define pb push_back
#define mp make_pair

using namespace std;

typedef long long ll;


typedef long double ld;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;

const ll MOD = 1e9 + 7;


const int maxn = 1e3 + 5;

void File()
{
freopen(TASK".inp", "r", stdin);
freopen(TASK".out", "w", stdout);
}

string s;

int root;
set <pii> adj[555];
int cnt[555];
pii ok[555];

void read()
{
getline(cin, s);
root = s[2];
ok[root] = {1, 1};
while (1) {
getline(cin, s);
if (s[0] == '$') break;
for (int i = 2; i < s.size(); i += 2) {
adj[s[0]].insert({++cnt[s[0]], s[i]});
ok[s[i]] = {s[0], cnt[s[0]]};
}
}
}
void pre(int u)
{
cout << char(u) << ' ';
for (pii v : adj[u]) pre(v.S);
}

void post(int u)
{
for (pii v : adj[u]) post(v.S);
cout << char(u) << ' ';
}

void muc(int u)
{
vector <int> vec;
vec.pb(u);
for (int x : vec) {
for (pii y : adj[x]) vec.pb(y.S);
cout << char(x) << ' ';
}
}

int Height(int u)
{
if (adj[u].size() == 0) return 0;
int Max = 0;
for (pii v : adj[u]) Max = max(Max, Height(v.S));
return Max + 1;
}

int NumNode(int u)
{
int sum = 1;
for (pii v : adj[u]) sum += NumNode(v.S);
return sum;
}

int la(int u)
{
if (adj[u].size() == 0) return 1;
int sum = 0;
for (pii v : adj[u]) sum += la(v.S);
return sum;
}

void AddNode()
{
for (;;) {
getline(cin, s);
if (s[0] == '$') break;
if (!ok[s[0]].F) continue;
for (int i = 2; i < s.size(); i += 2) {
adj[s[0]].insert({++cnt[s[0]], s[i]});
ok[s[i]] = {s[0], cnt[s[0]]};
}
}
}
void ddd(int u)
{
for (pii v : adj[u]) ddd(v.S);
adj[u].clear();
ok[u] = {0, 0};
}

void del()
{
for (;;) {
getline(cin, s);
if (s[0] == '$') break;
if (!ok[s[0]].F) continue;
adj[ok[s[0]].F].erase({ok[s[0]].S, s[0]});
ddd(s[0]);
}
}

int main()
{
//File();
ios::sync_with_stdio(0); cin.tie(0);

while (1) {
getline(cin, s);
if (s[0] != '?') break;
if (s[2] == 'r') read();
else if (s[2] == 'p' && s[3] == 'r') {
cout << "Duyet theo thu tu truoc: ";
pre(root);
cout << '\n';
}
else if (s[2] == 'p' && s[3] == 'o') {
cout << "Duyet theo thu tu sau: ";
post(root);
cout << '\n';
}
else if (s[2] == 'l') {
cout << "Duyet theo muc: ";
muc(root);
cout << '\n';
}
else if (s[2] == 'g' && s[5] == 'H') cout << "Chieu cao cua cay: " <<
Height(root) << '\n';
else if (s[2] == 'g' && s[10] == 'N') cout << "Tong so nut: " <<
NumNode(root) << '\n';
else if (s[2] == 'g' && s[10] == 'L') cout << "Tong so nut la: " <<
la(root) << '\n';
else if (s[2] == 'a') AddNode();
else if (s[2] == 'd') del();
}

return 0;
}

You might also like