#include <iostream>#include <stdio.h>#include <string.h>#include <cassert>using namespace std;class Skill { private: char *name; char *description; int level; public: Skill(){ }~Skill(){ }Skill(char * name, char* desc, int level){ this->name = name; this->description = desc; this->level = level;}char* getName(){ return this->name;}char* getDescription() { return this->description;}int getLevel(){ return this->level;}};struct TreeNode { Skill item; // The data in this node. TreeNode *left; // Pointer to the left subtree. TreeNode *right; // Pointer to the right subtree. TreeNode *middle; // Pointer to the right subtree. TreeNode (Skill sk) { item = sk; left = NULL; right = NULL; middle = NULL; }};class SkillTree { private: TreeNode* root; char Title[100]; public: SkillTree ():root(NULL) { } ~SkillTree (){ } SkillTree(char ch[]):root(NULL) { strcpy(this->Title, ch); } bool Empty() { if (this->root==NULL) return true; return false; }TreeNode* treeContains( TreeNode *root, char* parentName ) { if (root==NULL) { return NULL; } if ( strcmp(parentName, root->item.getName())==0 ) { return root; } if ( root->left!=NULL && strcmp(parentName,root->left->item.getName())==0) { return treeContains( root->left, parentName ); } if (root->middle !=NULL && strcmp(parentName , root->middle->item.getName())==0) { return treeContains( root->middle, parentName ); } if (root->right!=NULL && strcmp(parentName , root->right->item.getName())==0) { return treeContains( root->right, parentName ); } return root;} void AddSkill(char* name,char* desc,int level){ Skill item(name, desc,level); if(root==NULL) { this->root = new TreeNode(item); }}void AddSkill(char* name,char* desc,int level,char* parentName){ Skill item(name, desc,level); TreeNode* parent = treeContains(root, parentName); if (parent!=NULL) { if ( parent->left == NULL ) parent->left = new TreeNode(item); else if ( parent->middle == NULL ) parent->middle = new TreeNode(item); else if ( parent->right == NULL ) parent->right = new TreeNode(item); }} void inorderPrint( TreeNode *root ) { if ( root != NULL ) { cout<<root->item.getName() << " -- " <<root->item.getDescription() <<" [Lvl: " <<root->item.getLevel() <<"]\n"; inorderPrint( root->left ); inorderPrint( root->middle ); inorderPrint( root->right ); }}void Display(ostream& out){ out<<"Skill Tree: "<< Title <<"\n"; if (Empty()) { out<<" Empty\n"; } else { inorderPrint(root); }}};int main (){ SkillTree student("Student"); student.Display(cout) ; student.AddSkill("Alphabet","Mastery of letters and sounds",0); student.Display(cout); student.AddSkill("Reading","The ability to read all manner of written material",1,"Alphabet"); student.AddSkill("Writing","The ability to put your thoughts on paper",1,"Alphabet"); student.Display(cout); student.AddSkill("Speed Reading Level 1","Read any text twice as fast as normal",5,"Reading"); student.AddSkill("Speed Reading Level 2","Read any text four times as fast as normal",10,"Speed Reading Level 1"); student.AddSkill("Memorization","Memorize average sized texts",10,"Reading"); student.AddSkill("Massive Memorization","Memorize large sized texts",20,"Memorization"); student.AddSkill("Spell Writing","The ability to write spells",5,"Writing"); student.AddSkill("History","The ability to write (and rewrite) history",10,"Writing"); student.AddSkill("Written Creation","The ability to write things into reality",20,"History"); student.Display(cout); system("pause");}
TreeNode* SkillTree::treeContains( TreeNode *root, char* parentName ) { if (root==NULL) { return NULL; } if ( strcmp(parentName, root->item->getName())==0 ) { return root; } if ( root->left!=NULL ) { TreeNode * aux= treeContains( root->left, parentName ); if(aux!=NULL) return aux; } if (root->middle !=NULL ) { TreeNode * aux= treeContains( root->middle, parentName ); if(aux!=NULL) return aux; } if (root->right!=NULL ) { TreeNode * aux= treeContains( root->right, parentName ); if(aux!=NULL) return aux; } return NULL;}