Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.80 KB | None | 0 0
  1. BinaryTree.h
  2.  
  3. #ifndef BINARYTREE_H
  4. #define BINARYTREE_H
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. // This class is a template class that creates a binary
  9. // tree that can hold values of any data type. It has
  10. // functions to insert a node, delete a node, display the
  11. // tree In Order, Pre Order and Post Order, search for a
  12. // value, count the number of total nodes, left nodes,
  13. // and a function to determine the height of the tree.
  14.  
  15. template <class T>
  16. class BinaryTree
  17. {
  18. private:
  19. struct TreeNode
  20. {
  21. T value; // The value in the node
  22. TreeNode *left; // Pointer to left child node
  23. TreeNode *right; // Pointer to right child node
  24. };
  25.  
  26. TreeNode *root; // Pointer to the root node
  27.  
  28. // Private member functions
  29. void insert(TreeNode *&, TreeNode *&);
  30. void destroySubTree(TreeNode *);
  31. void deleteNode(T, TreeNode *&);
  32. void makeDeletion(TreeNode *&);
  33. void displayInOrder(TreeNode *) const;
  34. void displayPreOrder(TreeNode *) const;
  35. void displayPostOrder(TreeNode *) const;
  36. int counter(TreeNode *);
  37. int leafCounter(TreeNode *);
  38. int height(TreeNode *);
  39.  
  40. public:
  41. // Constructor
  42. BinaryTree()
  43. { root = NULL; }
  44.  
  45. // Destructor
  46. ~BinaryTree()
  47. { destroySubTree(root); }
  48.  
  49. // Binary tree operations
  50. void insertNode(T);
  51. bool searchNode(T);
  52. void remove(T);
  53.  
  54. void displayPreOrder() const
  55. { displayPreOrder(root); }
  56.  
  57. void displayInOrder() const
  58. { displayInOrder(root); }
  59.  
  60. void displayPostOrder() const
  61. { displayPostOrder(root); }
  62.  
  63. // Node counter
  64. int counter()
  65. {
  66. int n = counter(root);
  67. return n;
  68. }
  69.  
  70. // Leaf counter
  71. int leafCounter()
  72. {
  73. int leaf = leafCounter(root);
  74. return leaf;
  75. }
  76.  
  77. // Height of the tree
  78. int height()
  79. {
  80. int h = height(root);
  81. return h;
  82. }
  83. };
  84.  
  85. //*********************************************************
  86. // insert function accepts a TreeNode pointer and a *
  87. // pointer to a node. The function inserts the node into *
  88. // the tree pointer to by the TreeNode pointer. This *
  89. // function is call recursively. *
  90. //*********************************************************
  91. template <class T>
  92. void BinaryTree<T>::insert(TreeNode *&nodePtr, TreeNode *&newNode)
  93. {
  94. if (nodePtr == NULL)
  95. nodePtr = newNode; // Insert the node
  96. else if (newNode->value < nodePtr->value)
  97. insert(nodePtr->left, newNode); // Search the left branch
  98. else
  99. insert(nodePtr->right, newNode);// Search the right branch
  100. }
  101.  
  102. //*********************************************************
  103. // insertNode creates anew node to hold num as its value *
  104. // and passes it to the insert function. *
  105. //*********************************************************
  106. template <class T>
  107. void BinaryTree<T>::insertNode(T item)
  108. {
  109. TreeNode *newNode; // Pointer to a new node
  110.  
  111. // Create anew node and store num in it
  112. newNode = new TreeNode;
  113. newNode->value = item;
  114. newNode->left = newNode->right = NULL;
  115.  
  116. // Insert the node
  117. insert(root, newNode);
  118. }
  119.  
  120. //**********************************************************
  121. // destroySubTree is called by the destructor. It deletes *
  122. // all nodes in the tree. *
  123. //**********************************************************
  124. template <class T>
  125. void BinaryTree<T>::destroySubTree(TreeNode *nodePtr)
  126. {
  127. if (nodePtr)
  128. {
  129. if (nodePtr->left)
  130. destroySubTree(nodePtr->left);
  131. if (nodePtr->right)
  132. destroySubTree(nodePtr->right);
  133. delete nodePtr;
  134. }
  135. }
  136.  
  137. //**********************************************************
  138. // searchNode determines if a value is present in the tree.*
  139. // If so, the function returns true. Otherwise it returns *
  140. // false.
  141. //**********************************************************
  142. template <class T>
  143. bool BinaryTree<T>::searchNode(T item)
  144. {
  145. TreeNode *nodePtr = root;
  146.  
  147. while (nodePtr)
  148. {
  149. if (nodePtr->value == item)
  150. return true;
  151. else if (item < nodePtr->value)
  152. nodePtr = nodePtr->left;
  153. else
  154. nodePtr = nodePtr->right;
  155. }
  156. return false;
  157. }
  158.  
  159. //*********************************************************
  160. // remove calls deleteNode to delete the node whode value *
  161. // member is the same as num *
  162. //*********************************************************
  163. template <class T>
  164. void BinaryTree<T>::remove(T item)
  165. {
  166. deleteNode(item, root);
  167. }
  168.  
  169. //*********************************************************
  170. // deleteNode deletes the node whose value member is the *
  171. // same as num *
  172. //*********************************************************
  173. template <class T>
  174. void BinaryTree<T>::deleteNode(T item, TreeNode *&nodePtr)
  175. {
  176. if (item < nodePtr->value)
  177. deleteNode(item, nodePtr->left);
  178. else if (item > nodePtr->value)
  179. deleteNode(item, nodePtr->right);
  180. else
  181. makeDeletion(nodePtr);
  182. }
  183.  
  184. //*********************************************************
  185. // makeDeletion takes a reference to apointer to the node *
  186. // that is to be deleted. The node is removed and the *
  187. // branches of the tree below the node are reattached *
  188. //*********************************************************
  189. template <class T>
  190. void BinaryTree<T>::makeDeletion(TreeNode *&nodePtr)
  191. {
  192. // Define a temporary pointer to use in reattaching
  193. // the left subtree
  194. TreeNode *tempNodePtr;
  195.  
  196. if (nodePtr == NULL)
  197. cout << "Cannot delete empty node.\n";
  198. else if (nodePtr->right == NULL)
  199. {
  200. tempNodePtr = nodePtr;
  201. nodePtr = nodePtr->left; // Reattach the left child
  202. delete tempNodePtr;
  203. }
  204. else if (nodePtr->left == NULL)
  205. {
  206. tempNodePtr = nodePtr;
  207. nodePtr = nodePtr->right; // Reattach the right child
  208. delete tempNodePtr;
  209. }
  210.  
  211. }
  212. //*********************************************************
  213. // The displayInOrder function displays the values in the *
  214. // subtree pointed to by nodePtr, via inorder traversal *
  215. //*********************************************************
  216. template <class T>
  217. void BinaryTree<T>::displayInOrder(TreeNode *nodePtr) const
  218. {
  219. if (nodePtr)
  220. {
  221. displayInOrder(nodePtr->left);
  222. cout << nodePtr->value.getEmpID() << " "
  223. << getEmpName() << endl;
  224. displayInOrder(nodePtr->right);
  225. }
  226. }
  227. //*********************************************************
  228. // The displayPreOrder function displays the values in the*
  229. // subtree pointed to by nodePtr, via Preorder traversal *
  230. //*********************************************************
  231. template <class T>
  232. void BinaryTree<T>::displayPreOrder(TreeNode *nodePtr) const
  233. {
  234. if (nodePtr)
  235. {
  236. cout << nodePtr->value << endl;
  237. displayInOrder(nodePtr->left);
  238. displayInOrder(nodePtr->right);
  239. }
  240. }
  241. //*********************************************************
  242. // displayPostOrder function displays the values in the *
  243. // subtree pointed to by nodePtr, via Postorder traversal *
  244. //*********************************************************
  245. template <class T>
  246. void BinaryTree<T>::displayPostOrder(TreeNode *nodePtr) const
  247. {
  248. if (nodePtr)
  249. {
  250. displayInOrder(nodePtr->left);
  251. displayInOrder(nodePtr->right);
  252. cout << nodePtr->value << endl;
  253. }
  254. }
  255.  
  256. //*********************************************************
  257. // counter counts the number of nodes the tree has *
  258. //*********************************************************
  259. template <class T>
  260. int BinaryTree<T>::counter(TreeNode *nodePtr)
  261. {
  262. if (nodePtr == NULL)
  263. return 0;
  264. else
  265. return counter(nodePtr->left) +1+ counter(nodePtr->right);
  266. }
  267.  
  268. //*********************************************************
  269. // leafCounter counts the number of leaf nodes in the tree*
  270. //*********************************************************
  271. template <class T>
  272. int BinaryTree<T>::leafCounter(TreeNode *nodePtr)
  273. {
  274. if (nodePtr == NULL)
  275. return 0;
  276. else if (nodePtr->left == NULL && nodePtr->right == NULL)
  277. return 1;
  278. else
  279. return leafCounter(nodePtr->left) + leafCounter(nodePtr->right);
  280. }
  281.  
  282. //*********************************************************
  283. // height returns the height of the tree *
  284. //*********************************************************
  285. template <class T>
  286. int BinaryTree<T>::height(TreeNode *nodePtr)
  287. {
  288.  
  289. if(nodePtr == NULL)
  290. return -1;
  291. if (height(nodePtr->left) <= height(nodePtr->right))
  292. return (height(nodePtr->right) +1);
  293. else
  294. return (height(nodePtr->left) +1);
  295.  
  296. }
  297. #endif
  298. EmployeeInfo.h
  299.  
  300. #ifndef EMPLOYEEINFO_H
  301. #define EMPLOYEEINFO_H
  302. #include <string>
  303. using namespace std;
  304.  
  305. // This class has two data members to hold the employee ID
  306. // and the name of the employee.
  307.  
  308. class EmployeeInfo
  309. {
  310. private:
  311. int empID; // To hold employee ID number
  312. string empName; // To hold employee name
  313.  
  314. public:
  315. // Default Constructor
  316. EmployeeInfo();
  317.  
  318. // Constructor
  319. EmployeeInfo(int, string);
  320.  
  321. // Mutators
  322. void setEmpID(int);
  323. void setEmpName(string);
  324.  
  325. // Accessors
  326. int getEmpID();
  327. string getEmpName();
  328.  
  329. bool operator < (const EmployeeInfo &e)
  330. {
  331. if (empID < e.empID)
  332. return true;
  333. if (empName < e.empName)
  334. return true;
  335. return false;
  336. }
  337. };
  338. #endif
  339. #include "EmployeeInfo.h"
  340.  
  341. //*********************************************************
  342. // Default constructor intializes the data members *
  343. //*********************************************************
  344. EmployeeInfo::EmployeeInfo()
  345. {
  346. empID = 0;
  347. empName = "";
  348. }
  349.  
  350. //*********************************************************
  351. // Constructor sets the data members *
  352. //*********************************************************
  353. EmployeeInfo::EmployeeInfo(int ID, string name)
  354. {
  355. empID = ID;
  356. empName = name;
  357. }
  358.  
  359. //*********************************************************
  360. // setEmpID stores the employee ID number *
  361. //*********************************************************
  362. void EmployeeInfo::setEmpID(int ID)
  363. {
  364. empID = ID;
  365. }
  366.  
  367. //*********************************************************
  368. // setEmpName stores the full name of the employee *
  369. //*********************************************************
  370. void EmployeeInfo::setEmpName(string name)
  371. {
  372. empName = name;
  373. }
  374.  
  375. //*********************************************************
  376. // getEmpID returns the employee ID number *
  377. //*********************************************************
  378. int EmployeeInfo::getEmpID()
  379. {
  380. return empID;
  381. }
  382.  
  383. //*********************************************************
  384. // getEmpName returns the full name of the employee *
  385. //*********************************************************
  386. string EmployeeInfo::getEmpName()
  387. {
  388. return empName;
  389. }
  390. Main
  391.  
  392. #include "EmployeeInfo.h"
  393. #include "BinaryTree.h"
  394. #include <iostream>
  395. using namespace std;
  396.  
  397. int main()
  398. {
  399.  
  400. // Create an instance of BinaryTree
  401. BinaryTree<EmployeeInfo> tree;
  402.  
  403. // Create an EmployeeInfo object
  404. EmployeeInfo info;
  405. EmployeeInfo emp1(1021, "John Williams");
  406. EmployeeInfo emp2(1057, "Bill Witherspoon");
  407.  
  408. // Store the information
  409. info.setEmpID(1021);
  410. info.setEmpID(1057);
  411.  
  412. info.setEmpName("John Williams");
  413. info.setEmpName("Bill Witherspoon");
  414.  
  415. tree.insertNode(emp1);
  416. tree.insertNode(emp2);
  417.  
  418. // Display in order
  419. tree.displayInOrder();
  420. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement