Advertisement
Guest User

Untitled

a guest
Nov 17th, 2017
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.36 KB | None | 0 0
  1. #ifndef BST_H_
  2. #define BST_H_
  3. #include <stdexcept>
  4. #include <iterator>
  5. #include <deque>
  6. #include <stack>
  7. #include <string>
  8. #include <initializer_list>
  9.  
  10. class BinarySearchTree {
  11. public:
  12. enum class TreeTraversal {INORDER, PREORDER, POSTORDER};
  13. private:
  14. struct TreeNode{
  15. int key;
  16. TreeNode *left;
  17. TreeNode *right;
  18. TreeNode(int _key): key{_key}, left{nullptr}, right{nullptr}{}
  19. };
  20. TreeNode* root = nullptr;
  21. int size = 0;
  22. TreeTraversal method = TreeTraversal::INORDER;
  23. std::deque<int> queue;
  24. std::deque<TreeNode*> parents;
  25. public:
  26. BinarySearchTree() = default;
  27. virtual ~BinarySearchTree(){
  28. deleteNode(root);
  29. }
  30. int getSize(){ return size; }
  31. int numOfNodes(){
  32. if(isEmpty()) return 0;
  33. std::deque<TreeNode *> queue;
  34. queue.push_back(root);
  35. int count = 0;
  36. while(!queue.empty()){
  37. TreeNode* curr = queue.front();
  38. queue.pop_front();
  39. ++count;
  40. if(curr->left!=nullptr) queue.push_back(curr->left);
  41. if(curr->right!=nullptr) queue.push_back(curr->right);
  42. }
  43. return count;
  44. }
  45. int getHeight(){
  46. if(isEmpty()) return 0;
  47. struct Node{
  48. TreeNode* node;
  49. int level = 0;
  50. Node(TreeNode* _node, int _level):
  51. node{_node}, level{_level}{}
  52. };
  53. std::deque<Node> queue;
  54. queue.emplace_back(root,0);
  55. int maxLevel = 0;
  56. while(!queue.empty()){
  57. Node curr = queue.front();
  58. queue.pop_front();
  59. maxLevel = std::max(maxLevel,curr.level);
  60. if(curr.node->left!=nullptr)
  61. queue.emplace_back(curr.node->left,curr.level+1);
  62. if(curr.node->right!=nullptr)
  63. queue.emplace_back(curr.node->right,curr.level+1);
  64. }
  65. return maxLevel;
  66. }
  67. bool isEmpty() { return root==nullptr; }
  68. void setTraversalMethod(TreeTraversal method){
  69. this->method = method;
  70. }
  71. void add(int key){
  72. TreeNode *newNode = new TreeNode(key);
  73. if(isEmpty()){
  74. root = newNode;
  75. ++size;
  76. return;
  77. }
  78. TreeNode* parent = nullptr;
  79. bool isLeft = false;
  80. TreeNode* curr = root;
  81. while(curr!=nullptr){
  82. parent = curr;
  83. if(curr->key == key){
  84. delete newNode;
  85. return;
  86. }
  87. else if(curr->key>key){
  88. curr = curr->left;
  89. isLeft = true;
  90. }
  91. else{
  92. curr = curr->right;
  93. isLeft = false;
  94. }
  95. }
  96. if(isLeft) parent->left = newNode;
  97. else parent->right = newNode;
  98. ++size;
  99. }
  100.  
  101. void remove(int key)
  102. {
  103. TreeNode *removeNode = findNode(key, root); //삭제 할 노드 검색
  104. if(removeNode==nullptr) std::invalid_argument("삭제 할 키 존재x");
  105.  
  106. TreeNode *parent = nullptr; //부모노드
  107. TreeNode *son = nullptr; //자식노드
  108.  
  109. bool isLeft = false; //왼쪽방향으로가면 true 아닐시 false
  110.  
  111. while(removeNode!=nullptr)
  112. {
  113. if(removeNode->key == key)
  114. {
  115. break;
  116. }
  117.  
  118. parent = removeNode;
  119.  
  120. if(removeNode->key > key) {
  121. removeNode = removeNode->left;
  122. isLeft = true;
  123. }
  124.  
  125. else
  126. {
  127. removeNode = removeNode->right;
  128. isLeft = false;
  129. }
  130.  
  131. son = removeNode;
  132. }
  133. if(isLeft) parent = nullptr;
  134. else son = nullptr;
  135. --size;
  136. }
  137.  
  138. bool find(int key){
  139. parents.clear();
  140. return findNode(key,root)!=nullptr;
  141. }
  142.  
  143. using dequeIterator = std::deque<int>::iterator;
  144. dequeIterator begin(){
  145. queue.clear();
  146. switch(method){
  147. case TreeTraversal::INORDER: inOrder(root); break;
  148. case TreeTraversal::PREORDER: preOrder(root); break;
  149. case TreeTraversal::POSTORDER: postOrder(root); break;
  150. }
  151. return queue.begin();
  152. }
  153. dequeIterator end(){ return queue.end(); }
  154. private:
  155. void deleteNode(TreeNode* node){
  156. std::deque<TreeNode*> bfsQueue;
  157. bfsQueue.push_back(node);
  158. while(!bfsQueue.empty()){
  159. TreeNode* curr = bfsQueue.front();
  160. bfsQueue.pop_front();
  161. if(curr->left) bfsQueue.push_back(curr->left);
  162. if(curr->right) bfsQueue.push_back(curr->right);
  163. delete curr;
  164. }
  165. }
  166. TreeNode* findNode(int key, TreeNode* node){
  167. if(node==nullptr) return nullptr;
  168. TreeNode* curr = node;
  169. while(curr!=nullptr){
  170. if(curr->key==key) return curr;
  171. parents.push_front(curr);
  172. if(curr->key>key) curr = curr->left;
  173. else curr = curr->right;
  174. }
  175. return nullptr;
  176. }
  177.  
  178. };
  179.  
  180. #endif /* BST_H_ */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement