Source of BinaryNodeTree.cpp


  1: //  Created by Frank M. Carrano and Tim Henry.
  2: //  Copyright (c) 2013 __Pearson Education__. All rights reserved.

  4: // PARITALLY COMPLETE.

  6: /** @file BinaryTree.cpp */

  8: #include "BinaryNodeTree.h" 
  9: #include "BinaryNode.h" 
 10: #include <iostream>

 12: //////////////////////////////////////////////////////////////
 13: //      Protected Utility Methods Section
 14: //////////////////////////////////////////////////////////////

 16: template<class ItemType>
 17: int BinaryNodeTree<ItemType>::getHeightHelper(BinaryNode<ItemType>* subTreePtr) const
 18: {
 19:    if (subTreePtr == nullptr)
 20:       return 0;
 21:    else
 22:       return 1 + max(getHeightHelper(subTreePtr->getLeftChildPtr()), 
 23:                      getHeightHelper(subTreePtr->getRightChildPtr()));
 24: }  // end getHeightHelper

 26: template<class ItemType>
 27: BinaryNode<ItemType>* BinaryNodeTree<ItemType>::balancedAdd(BinaryNode<ItemType>* subTreePtr,
 28:                                                             BinaryNode<ItemType>* newNodePtr)
 29: {
 30:    if (subTreePtr == nullptr)
 31:       return newNodePtr;
 32:    else
 33:    {
 34:       BinaryNode<ItemType>* leftPtr = subTreePtr->getLeftChildPtr();
 35:       BinaryNode<ItemType>* rightPtr = subTreePtr->getRightChildPtr();
 36:       
 37:       if (getHeightHelper(leftPtr) > getHeightHelper(rightPtr))
 38:       {
 39:          rightPtr = balancedAdd(rightPtr , newNodePtr);
 40:          subTreePtr->setRightChildPtr(rightPtr );
 41:       }
 42:       else
 43:       {
 44:          leftPtr = balancedAdd(leftPtr, newNodePtr);
 45:          subTreePtr->setLeftChildPtr(leftPtr);
 46:       }  // end if
 47:       
 48:       return subTreePtr;
 49:    }  // end if
 50: }  // end balancedAdd

 52: template<class ItemType>
 53: BinaryNode<ItemType>* BinaryNodeTree<ItemType>::copyTree(const BinaryNode<ItemType>* treePtr) const
 54: {
 55:    BinaryNode<ItemType>* newTreePtr = nullptr;
 56:    
 57:    // Copy tree nodes during a preorder traversal
 58:    if (treePtr != nullptr)
 59:    {
 60:       // Copy node
 61:            newTreePtr = new BinaryNode<ItemType>(treePtr->getItem(), nullptr, nullptr);
 62:            newTreePtr->setLeftChildPtr(copyTree(treePtr->getLeftChildPtr()));
 63:       newTreePtr->setRightChildPtr(copyTree(treePtr->getRightChildPtr()));
 64:    }  // end if
 65:    
 66:    return newTreePtr;
 67: }  // end copyTree

 69: template<class ItemType>
 70: void BinaryNodeTree<ItemType>::destroyTree(BinaryNode<ItemType>* subTreePtr)
 71: {
 72:    if (subTreePtr != nullptr)
 73:    {
 74:       destroyTree(subTreePtr->getLeftChildPtr());
 75:       destroyTree(subTreePtr->getRightChildPtr());
 76:       delete subTreePtr;
 77:    }  // end if
 78: }  // end destroyTree

 80: //////////////////////////////////////////////////////////////
 81: //      Protected Tree Traversal Sub-Section
 82: //////////////////////////////////////////////////////////////

 84: template<class ItemType>
 85: void BinaryNodeTree<ItemType>::inorder(void visit(ItemType&), BinaryNode<ItemType>* treePtr) const
 86: {
 87:    if (treePtr != nullptr)
 88:    {
 89:       inorder(visit, treePtr->getLeftChildPtr());
 90:       ItemType theItem = treePtr->getItem();
 91:       visit(theItem);
 92:       inorder(visit, treePtr->getRightChildPtr());
 93:    }  // end if
 94: }  // end inorder

 96: //////////////////////////////////////////////////////////////
 97: //      PUBLIC METHODS BEGIN HERE
 98: //////////////////////////////////////////////////////////////

100: //////////////////////////////////////////////////////////////
101: //      Constructor and Destructor Section
102: //////////////////////////////////////////////////////////////

104: template<class ItemType>
105: BinaryNodeTree<ItemType>::BinaryNodeTree() : rootPtr(nullptr)
106: {
107: }  // end default constructor

109: template<class ItemType>
110: BinaryNodeTree<ItemType>::BinaryNodeTree(const ItemType& rootItem)
111: {
112:    rootPtr = new BinaryNode<ItemType>(rootItem, nullptr, nullptr);
113: }  // end constructor

115: template<class ItemType>
116: BinaryNodeTree<ItemType>::BinaryNodeTree(const ItemType& rootItem,
117:                                          const BinaryNodeTree<ItemType>* leftTreePtr,
118:                                          const BinaryNodeTree<ItemType>* rightTreePtr)
119: {
120:     rootPtr = new BinaryNode<ItemType>(rootItem, copyTree(leftTreePtr->rootPtr), 
121:                                                  copyTree(rightTreePtr->rootPtr));
122: }  // end constructor

124: template<class ItemType>
125: BinaryNodeTree<ItemType>::BinaryNodeTree(const BinaryNodeTree<ItemType>& treePtr)
126: {
127:    rootPtr = copyTree(treePtr.rootPtr);
128: }  // end copy constructor

130: template<class ItemType>
131: BinaryNodeTree<ItemType>::~BinaryNodeTree()
132: {
133:    destroyTree(rootPtr);
134: }  // end destructor

136: //////////////////////////////////////////////////////////////
137: //      Public BinaryTreeInterface Methods Section
138: //////////////////////////////////////////////////////////////

140: template<class ItemType>
141: bool BinaryNodeTree<ItemType>::add(const ItemType& newData)
142: {
143:    BinaryNode<ItemType>* newNodePtr = new BinaryNode<ItemType>(newData);
144:    rootPtr = balancedAdd(rootPtr, newNodePtr);
145:    return true;
146: }  // end add

148: }  // end contains

150: //////////////////////////////////////////////////////////////
151: //      Public Traversals Section
152: //////////////////////////////////////////////////////////////

154: template<class ItemType>
155: void BinaryNodeTree<ItemType>::inorderTraverse(void visit(ItemType&)) const
156: {
157:    inorder(visit, rootPtr);
158: }  // end inorderTraverse