fork(2) download
  1. #include <iostream>
  2.  
  3. class bst_t
  4. {
  5. private:
  6. struct node_t
  7. {
  8. node_t * left;
  9. node_t * right;
  10. int value;
  11. };
  12.  
  13. node_t * root_;
  14.  
  15. static void insert_node(node_t * & node, int value)
  16. {
  17. auto current_pointer = &node;
  18.  
  19. while (true)
  20. {
  21. auto & current = *current_pointer;
  22.  
  23. if (current == nullptr)
  24. {
  25. current = new node_t{nullptr, nullptr, value};
  26. return;
  27. }
  28.  
  29. if (value < current->value) current_pointer = &current->left;
  30. else if (current->value < value) current_pointer = &current->right;
  31. else return;
  32. }
  33. }
  34.  
  35. template<typename Functor>
  36. static void iterate_node(node_t * node, Functor functor)
  37. {
  38. if (node == nullptr) return;
  39.  
  40. iterate_node(node->left, functor);
  41. functor(node->value);
  42. iterate_node(node->right, functor);
  43. }
  44.  
  45. static void delete_node(node_t * node)
  46. {
  47. if (node == nullptr) return;
  48.  
  49. delete_node(node->left);
  50. delete_node(node->right);
  51. delete node;
  52. }
  53.  
  54. public:
  55. bst_t()
  56. :
  57. root_{nullptr}
  58. {}
  59.  
  60. ~bst_t()
  61. {
  62. delete_node(root_);
  63. }
  64.  
  65. void insert(int value)
  66. {
  67. insert_node(root_, value);
  68. }
  69.  
  70. template<typename Functor>
  71. void iterate(Functor functor)
  72. {
  73. iterate_node(root_, functor);
  74. }
  75. };
  76.  
  77. int main()
  78. {
  79. bst_t bst;
  80. bst.insert(10);
  81. bst.insert(20);
  82. bst.insert(5);
  83. bst.insert(15);
  84. bst.insert(30);
  85.  
  86. bst.iterate([](int i)
  87. {
  88. std::cout << i << "\n";
  89. });
  90. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
5
10
15
20
30