Guest User

Untitled

a guest
Mar 24th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. #include <memory>
  2. #include <string>
  3. #include <vector>
  4. #include <assert.h>
  5.  
  6. using namespace std;
  7.  
  8. class Node
  9. {
  10. vector<shared_ptr<Node>> childs;
  11. Node* parent = nullptr;//not shared_ptr! because of memory leaks of circular dependency
  12. int level = 0;
  13. public:
  14. string name;
  15. Node(string name)
  16. {
  17. this->name = name;
  18. }
  19. ~Node()
  20. {
  21. printf("delete %s\n",name.c_str());
  22. }
  23. shared_ptr<Node> cloneOne()
  24. {
  25. shared_ptr<Node> result = make_shared<Node>(name+"a");
  26. return result;
  27. }
  28.  
  29. shared_ptr<Node> cloneTree()
  30. {
  31. shared_ptr<Node> newElem = cloneOne();
  32. for (size_t i = 0; i<childs.size(); i++)
  33. {
  34. shared_ptr<Node> subElem = childs[i]->cloneTree();
  35. newElem->AddOneChild(subElem);
  36. }
  37. return newElem;
  38. }
  39.  
  40. void erase()
  41. {
  42. printf("erase from %s\n", name.c_str());
  43. childs.clear();
  44. }
  45. void deleteChild(int index)
  46. {
  47. printf("delete child %d from %s - %s\n", index, name.c_str(), childs[index]->name.c_str());
  48. childs.erase(childs.begin()+index);
  49. }
  50.  
  51. void setLevel(int level)
  52. {
  53. this->level = level;
  54. for (size_t i = 0; i<childs.size(); i++)
  55. childs[i]->setLevel(level+1);
  56. }
  57.  
  58. void AddOneChild(shared_ptr<Node> node)
  59. {
  60. childs.push_back(node);
  61. node->parent = this;
  62. }
  63.  
  64. void InsertOneChild(int index, shared_ptr<Node> node)
  65. {
  66. childs.insert(childs.begin() + index, node);
  67. node->parent = this;
  68. }
  69.  
  70. void AddTree(shared_ptr<Node> subtree)
  71. {
  72. shared_ptr<Node> clone = subtree->cloneTree();
  73. AddOneChild(clone);
  74. clone->setLevel(level+1);
  75. }
  76.  
  77. void InsertTree(int index, shared_ptr<Node> subtree)
  78. {
  79. shared_ptr<Node> clone = subtree->cloneTree();
  80. InsertOneChild(index, clone);
  81. clone->setLevel(level + 1);
  82. }
  83.  
  84. void ReplaceChild(int index, shared_ptr<Node> subtree)
  85. {
  86. shared_ptr<Node> clone = subtree->cloneTree();
  87. deleteChild(index);
  88. InsertOneChild(index, clone);
  89. clone->setLevel(level + 1);
  90. }
  91.  
  92. shared_ptr<Node>& at(int index)
  93. {
  94. return childs[index];
  95. }
  96.  
  97. void print()
  98. {
  99. for (int i = 0; i<level; i++)
  100. printf(" ");
  101. printf("%s->",name.c_str());
  102. if (parent) printf("%s", parent->name.c_str());
  103. printf("\n");
  104. for (size_t i=0; i<childs.size(); i++)
  105. childs[i]->print();
  106. }
  107. };
  108.  
  109. int main()
  110. {
  111. shared_ptr<Node>root,rootB;
  112. root = make_shared<Node>("1");
  113. root->AddTree(make_shared<Node>("2"));
  114. root->AddTree(make_shared<Node>("3"));
  115. root->at(0)->AddTree(make_shared<Node>("4"));
  116. root->at(0)->AddTree(make_shared<Node>("5"));
  117. root->at(1)->AddTree(make_shared<Node>("6"));
  118. root->at(1)->AddTree(make_shared<Node>("7"));
  119. root->print();
  120. root->ReplaceChild(0,root);
  121. root->print();
  122. return 0;
  123. }
Add Comment
Please, Sign In to add comment