diff --git a/TinySTL/AVLTree.h b/TinySTL/AVLTree.h index 2d0fba9..0f40bf8 100644 --- a/TinySTL/AVLTree.h +++ b/TinySTL/AVLTree.h @@ -3,6 +3,7 @@ #include "Allocator.h" #include "Stack.h" +#include "String.h" #include @@ -31,6 +32,7 @@ namespace TinySTL{ typedef T value_type; typedef avl_iter const_iterator; typedef const T& const_reference; + typedef size_t size_type; private: node *root_; size_t size_; @@ -51,6 +53,11 @@ namespace TinySTL{ const_iterator find_min(); const_iterator find_max(); const_iterator find(const T& val); + + void print_preorder(const string& delim = " ", std::ostream& os = std::cout)const; + void print_inorder(const string& delim = " ", std::ostream& os = std::cout)const; + void print_postorder(const string& delim = " ", std::ostream& os = std::cout)const; + void print_levelorder(const string& delim = " ", std::ostream& os = std::cout)const; private: void destroyAndDeallocateAllNodes(node *p){ if (p != 0){ @@ -63,8 +70,62 @@ namespace TinySTL{ const_iterator find_min_aux(const node *ptr); const_iterator find_max_aux(const node *ptr); const_iterator find_aux(const T& val, const node *ptr); + void print_preorder_aux(const string& delim, std::ostream& os, const node *ptr)const; + void print_inorder_aux(const string& delim, std::ostream& os, const node *ptr)const; + void print_postorder_aux(const string& delim, std::ostream& os, const node *ptr)const; };// end of avl_tree template + void avl_tree::print_preorder_aux(const string& delim, std::ostream& os, const node *ptr)const{ + if (ptr != 0){ + os << ptr->data_ << delim; + print_preorder_aux(delim, os, ptr->left_); + print_preorder_aux(delim, os, ptr->right_); + } + } + template + void avl_tree::print_preorder(const string& delim, std::ostream& os)const{ + print_preorder_aux(delim, os, root_); + } + template + void avl_tree::print_inorder_aux(const string& delim, std::ostream& os, const node *ptr)const{ + if (ptr != 0){ + print_inorder_aux(delim, os, ptr->left_); + os << ptr->data_ << delim; + print_inorder_aux(delim, os, ptr->right_); + } + } + template + void avl_tree::print_inorder(const string& delim, std::ostream& os)const{ + print_inorder_aux(delim, os, root_); + } + template + void avl_tree::print_postorder_aux(const string& delim, std::ostream& os, const node *ptr)const{ + if (ptr != 0){ + print_postorder_aux(delim, os, ptr->left_); + print_postorder_aux(delim, os, ptr->right_); + os << ptr->data_ << delim; + } + } + template + void avl_tree::print_postorder(const string& delim, std::ostream& os)const{ + print_postorder_aux(delim, os, root_); + } + template + void avl_tree::print_levelorder(const string& delim, std::ostream& os)const{ + auto temp = root_; + if (temp != 0){ + std::deque q; + q.push_back(temp); + while (!q.empty()){ + temp = q.front(); + q.pop_front(); + os << temp->data_ << delim; + if (temp->left_ != 0) q.push_back(temp->left_); + if (temp->right_ != 0) q.push_back(temp->right); + } + } + } + template typename avl_tree::const_iterator avl_tree::find_aux(const T& val, const node *ptr){ while (ptr != 0){ if (ptr->data_ < val)