#include <iostream>
#include <string>
#include <vector>
#include <memory>
using namespace std;
// char* replaced with strings
// Node*[] repaced with vector
// Node* replaced with shared_ptr
struct Skill {
string name, desc;
int level;
Skill() = default;
Skill(string& name, string& desc, int level) : name(name), desc(desc), level(level) {}
};
struct Node {
weak_ptr<Node> parent;
Skill sk;
vector<shared_ptr<Node>>children;
Node() = default;
Node(Skill s) : sk(s) {}
void show(int n) {
cout << string(n * 2, ' ') << sk.name << endl;
for (auto &x : children) // easy way to traverse a vector, intead of for (i=0; i<...; i++)
x->show(n + 1);
}
};
class Tree {
public:
shared_ptr<Node>root;
void show() { root->show(0); }
void AddSkill(string name, string desc, int level);
void AddSkill(string name, string desc, int level, string parentname);
protected:
void AddSkill(shared_ptr<Node>n, Skill&s, string &parentname); // helper for recursive search
};
void Tree::AddSkill(string name, string desc, int level)
{
Skill s(name, desc, level);
shared_ptr<Node> newNode = make_shared<Node>(s); // like new Node(s) but for shared pointers
if (root == NULL)
root = newNode;
else
{
root->parent = newNode;
newNode->children.push_back(root);
root = newNode;
}
}
void Tree::AddSkill(shared_ptr<Node>node, Skill& s, string& parentName)
{
if (node->sk.name == parentName) { // if found, add the new node as childen
shared_ptr<Node> child = make_shared<Node>(s); // like new Node(s) but for shared pointers
child->parent = node;
node->children.push_back(child);
}
else {
for (auto &x : node->children) // for all the children
AddSkill(x, s, parentName); // search recursively
}
}
void Tree::AddSkill(string name, string desc, int level, string parentName)
{
if (root == NULL)
{
cout << "Error: no nodes in tree.\n";
return;
}
Skill s(name, desc, level);
AddSkill(root, s, parentName);
}
int main()
{
Tree t;
t.AddSkill("main", "", 0);
t.AddSkill("IT", "", 0, "main");
t.AddSkill("Management", "", 0, "main");
t.AddSkill("C++", "", 100, "IT");
t.AddSkill("Java", "", 100, "IT");
t.AddSkill("SQL", "", 100, "IT");
t.show();
cin.get();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKCi8vIGNoYXIqIHJlcGxhY2VkIHdpdGggc3RyaW5ncyAKLy8gTm9kZSpbXSByZXBhY2VkIHdpdGggdmVjdG9yCi8vIE5vZGUqIHJlcGxhY2VkIHdpdGggc2hhcmVkX3B0cgoKc3RydWN0IFNraWxsIHsKCXN0cmluZyBuYW1lLCBkZXNjOyAKCWludCBsZXZlbDsKCVNraWxsKCkgPSBkZWZhdWx0OyAKCVNraWxsKHN0cmluZyYgbmFtZSwgc3RyaW5nJiBkZXNjLCBpbnQgbGV2ZWwpIDogbmFtZShuYW1lKSwgZGVzYyhkZXNjKSwgbGV2ZWwobGV2ZWwpIHt9Cn07CnN0cnVjdCBOb2RlIHsKCXdlYWtfcHRyPE5vZGU+IHBhcmVudDsgIAoJU2tpbGwgc2s7IAoJdmVjdG9yPHNoYXJlZF9wdHI8Tm9kZT4+Y2hpbGRyZW47CglOb2RlKCkgPSBkZWZhdWx0OwoJTm9kZShTa2lsbCBzKSA6IHNrKHMpIHt9Cgl2b2lkIHNob3coaW50IG4pIHsgCgkJY291dCA8PCBzdHJpbmcobiAqIDIsICcgJykgPDwgc2submFtZSA8PCBlbmRsOwoJCWZvciAoYXV0byAmeCA6IGNoaWxkcmVuKSAgLy8gZWFzeSB3YXkgdG8gdHJhdmVyc2UgYSB2ZWN0b3IsIGludGVhZCBvZiBmb3IgKGk9MDsgaTwuLi47IGkrKykKCQkJeC0+c2hvdyhuICsgMSk7Cgl9Cn07CmNsYXNzIFRyZWUgewpwdWJsaWM6CglzaGFyZWRfcHRyPE5vZGU+cm9vdDsKCXZvaWQgc2hvdygpIHsgcm9vdC0+c2hvdygwKTsgfQoJdm9pZCBBZGRTa2lsbChzdHJpbmcgbmFtZSwgc3RyaW5nIGRlc2MsIGludCBsZXZlbCk7Cgl2b2lkIEFkZFNraWxsKHN0cmluZyBuYW1lLCBzdHJpbmcgZGVzYywgaW50IGxldmVsLCBzdHJpbmcgcGFyZW50bmFtZSk7CnByb3RlY3RlZDogIAoJdm9pZCBBZGRTa2lsbChzaGFyZWRfcHRyPE5vZGU+biwgU2tpbGwmcywgc3RyaW5nICZwYXJlbnRuYW1lKTsgIC8vIGhlbHBlciBmb3IgcmVjdXJzaXZlIHNlYXJjaAp9OwoKdm9pZCBUcmVlOjpBZGRTa2lsbChzdHJpbmcgbmFtZSwgc3RyaW5nIGRlc2MsIGludCBsZXZlbCkKewoJU2tpbGwgcyhuYW1lLCBkZXNjLCBsZXZlbCk7CglzaGFyZWRfcHRyPE5vZGU+IG5ld05vZGUgPSBtYWtlX3NoYXJlZDxOb2RlPihzKTsgIC8vIGxpa2UgbmV3IE5vZGUocykgYnV0IGZvciBzaGFyZWQgcG9pbnRlcnMKCWlmIChyb290ID09IE5VTEwpCgkJcm9vdCA9IG5ld05vZGU7CgllbHNlCgl7CgkJcm9vdC0+cGFyZW50ID0gbmV3Tm9kZTsKCQluZXdOb2RlLT5jaGlsZHJlbi5wdXNoX2JhY2socm9vdCk7CgkJcm9vdCA9IG5ld05vZGU7Cgl9Cn0KCnZvaWQgVHJlZTo6QWRkU2tpbGwoc2hhcmVkX3B0cjxOb2RlPm5vZGUsIFNraWxsJiBzLCBzdHJpbmcmIHBhcmVudE5hbWUpCnsKCWlmIChub2RlLT5zay5uYW1lID09IHBhcmVudE5hbWUpIHsgIC8vIGlmIGZvdW5kLCBhZGQgdGhlIG5ldyBub2RlIGFzIGNoaWxkZW4KCQlzaGFyZWRfcHRyPE5vZGU+IGNoaWxkID0gbWFrZV9zaGFyZWQ8Tm9kZT4ocyk7IC8vIGxpa2UgbmV3IE5vZGUocykgYnV0IGZvciBzaGFyZWQgcG9pbnRlcnMKCQljaGlsZC0+cGFyZW50ID0gbm9kZTsKCQlub2RlLT5jaGlsZHJlbi5wdXNoX2JhY2soY2hpbGQpOwoJfQoJZWxzZSB7CgkJZm9yIChhdXRvICZ4IDogbm9kZS0+Y2hpbGRyZW4pICAgLy8gZm9yIGFsbCB0aGUgY2hpbGRyZW4gCgkJCUFkZFNraWxsKHgsIHMsIHBhcmVudE5hbWUpOyAgLy8gc2VhcmNoIHJlY3Vyc2l2ZWx5ICAgCgl9Cn0KCnZvaWQgVHJlZTo6QWRkU2tpbGwoc3RyaW5nIG5hbWUsIHN0cmluZyAgZGVzYywgaW50IGxldmVsLCBzdHJpbmcgcGFyZW50TmFtZSkKewoJaWYgKHJvb3QgPT0gTlVMTCkKCXsKCQljb3V0IDw8ICJFcnJvcjogbm8gbm9kZXMgaW4gdHJlZS5cbiI7CgkJcmV0dXJuOwoJfQoJU2tpbGwgcyhuYW1lLCBkZXNjLCBsZXZlbCk7CglBZGRTa2lsbChyb290LCBzLCBwYXJlbnROYW1lKTsgCn0KCmludCBtYWluKCkKewoJVHJlZSB0OyAgCgl0LkFkZFNraWxsKCJtYWluIiwgIiIsIDApOwoJdC5BZGRTa2lsbCgiSVQiLCAiIiwgMCwgIm1haW4iKTsKCXQuQWRkU2tpbGwoIk1hbmFnZW1lbnQiLCAiIiwgMCwgIm1haW4iKTsKCXQuQWRkU2tpbGwoIkMrKyIsICIiLCAxMDAsICJJVCIpOyAKCXQuQWRkU2tpbGwoIkphdmEiLCAiIiwgMTAwLCAiSVQiKTsKCXQuQWRkU2tpbGwoIlNRTCIsICIiLCAxMDAsICJJVCIpOwoJdC5zaG93KCk7CgljaW4uZ2V0KCk7IAp9