class ThroneInheritance {
public:
typedef struct node {
string name;
int death;
vector<struct node*> children;
} NODE;
map<string, NODE*> status;
NODE* root;
NODE* createNode(string name) {
NODE* node = new NODE();
node->name = name;
node->death = 0;
node->children = vector<NODE*>{};
return node;
}
ThroneInheritance(string kingName) {
root = createNode(kingName);
status[kingName] = root;
}
void birth(string parentName, string childName) {
//get the node for the parentName
NODE* node = status[parentName];
cout << "parentName:" << node->name << endl;
//creat a child;
NODE* child = createNode(childName);
status[childName] = child;
node->children.push_back(child);
}
void death(string name) {
//get the node name
NODE* node = status[name];
node->death = 1;
}
void dfs(NODE* node, vector<string>& curOrder) {
if(node->death == 0)
curOrder.push_back(node->name);
for(int i=0; i<node->children.size(); i++) {
dfs(node->children[i], curOrder);
}
}
vector<string> getInheritanceOrder() {
vector<string> curOrder;
dfs(root, curOrder);
return curOrder;
}
};
/**
* Your ThroneInheritance object will be instantiated and called as such:
* ThroneInheritance* obj = new ThroneInheritance(kingName);
* obj->birth(parentName,childName);
* obj->death(name);
* vector<string> param_3 = obj->getInheritanceOrder();
*/