fork download
  1. #ifndef BINARYTREE_H
  2. #define BINARYTREE_H
  3. using namespace std;
  4.  
  5. #include <iostream>
  6. #include <memory>
  7.  
  8. template<typename T> class BinaryTree
  9. {
  10. public:
  11. // Binary Tree Things
  12. BinaryTree(); // default constructor to make empty tree
  13. BinaryTree(T ro); // default constructor 2 to make tree with only root
  14. BinaryTree(T ro, T le, T ri); // default constructor 3 to make complete binary tree
  15.  
  16. bool isEmpty(); // method that returns t/f if tree is empty
  17. T info(); // method to return value in root of the tree
  18. void inOrder(); // traverses nodes in a tree left, root, right
  19. void preOrder(); // traverses nodes in a tree root, left, right
  20. void postOrder(); // traverses nodes in a tree left, right, root
  21.  
  22. private:
  23. struct Tree_Node;
  24. typedef std::shared_ptr<Tree_Node> NodePtr;
  25.  
  26. struct Tree_Node // represents a node
  27. {
  28. T data;
  29. NodePtr left; // left pointer
  30. NodePtr right; // right pointer
  31.  
  32. Tree_Node(T data, NodePtr left = 0, NodePtr right = 0)
  33. : data(data), left(left), right(right) {}
  34.  
  35. void inOrder() // traverses nodes in a tree left, root, right
  36. {
  37. if (left) left->inOrder();
  38. //else std::cout << "[left null]\n";
  39.  
  40. std::cout << data << "\n";
  41.  
  42. if (right) right->inOrder();
  43. //else std::cout << "[right null]\n";
  44. }
  45. void preOrder() // traverses nodes in a tree root, left, right
  46. {
  47. std::cout << data << "\n";
  48.  
  49. if (left) left->preOrder();
  50. //else std::cout << "[left null]\n";
  51.  
  52. if (right) right->preOrder();
  53. //else std::cout << "[right null]\n";
  54. }
  55. void postOrder() // traverses nodes in a tree left, right, root
  56. {
  57. if (left) left->postOrder();
  58. //else std::cout << "[left null]\n";
  59.  
  60. if (right) right->postOrder();
  61. //else std::cout << "[right null]\n";
  62.  
  63. std::cout << data << "\n";
  64. }
  65. };
  66.  
  67. NodePtr root; // create root with 2 pointers from this
  68. };
  69. /***********************************************************************/
  70.  
  71. template<typename T> BinaryTree<T>::BinaryTree()
  72. : root(0)
  73. {
  74. }
  75.  
  76. template<typename T> BinaryTree<T>::BinaryTree(T ro)
  77. : root(new Tree_Node(ro))
  78. {
  79. }
  80.  
  81. template<typename T> BinaryTree<T>::BinaryTree(T ro, T le, T ri)
  82. : root(new Tree_Node(ro, NodePtr(new Tree_Node (le)), NodePtr(new Tree_Node (ri))))
  83. {
  84. }
  85.  
  86. template<typename T> bool BinaryTree<T>::isEmpty()
  87. {
  88. return !root;
  89. }
  90.  
  91. template<typename T> T BinaryTree<T>::info()
  92. {
  93. if (!root) throw "oops";
  94. return root->data;
  95. }
  96.  
  97. template<typename T> void BinaryTree<T>::inOrder()
  98. {
  99. if (root)
  100. root->inOrder();
  101. }
  102.  
  103. template<typename T> void BinaryTree<T>::preOrder()
  104. {
  105. if (root)
  106. root->preOrder();
  107. }
  108.  
  109. template<typename T> void BinaryTree<T>::postOrder()
  110. {
  111. if (root)
  112. root->postOrder();
  113. }
  114.  
  115. #endif /* BINARYTREE_H */
  116.  
  117. #include <iostream>
  118. #include <stack>
  119. //#include "BinaryTree.h"
  120. //#include "stack.h"
  121.  
  122. using namespace std;
  123.  
  124. int main()
  125. {
  126. BinaryTree<char> testing2('a', 'b', 'c');
  127. std::cout << "------------- inOrder: \n";
  128. testing2.inOrder();
  129. std::cout << "------------- preOrder: \n";
  130. testing2.preOrder();
  131. std::cout << "------------- postOrder: \n";
  132. testing2.postOrder();
  133.  
  134. std::stack<BinaryTree<char> > testing;
  135. testing.push(testing2);
  136. cout << testing.size();
  137. return 0;
  138. }
  139.  
Success #stdin #stdout 0s 3440KB
stdin
Standard input is empty
stdout
------------- inOrder: 
b
a
c
------------- preOrder: 
a
b
c
------------- postOrder: 
b
c
a
1