1: // Created by Frank M. Carrano and Timothy M. Henry.
2: // Copyright (c) 2017 Pearson Education, Hoboken, New Jersey.
4: template<class ItemType>
5: BinaryNodeTree<ItemType>::BinaryNodeTree() : rootPtr(nullptr)
6: {
7: } // end default constructor
9: template<class ItemType>
10: BinaryNodeTree<ItemType>::
11: BinaryNodeTree(const ItemType& rootItem)
12: : rootPtr(std::make_shared<BinaryNode<ItemType>>(rootItem, nullptr, nullptr))
13: {
14: } // end constructor
16: template<class ItemType>
17: BinaryNodeTree<ItemType>::
18: BinaryNodeTree(const ItemType& rootItem,
19: const std::shared_ptr<BinaryNodeTree<ItemType>> leftTreePtr,
20: const std::shared_ptr<BinaryNodeTree<ItemType>> rightTreePtr)
21: : rootPtr(std::make_shared<BinaryNode<ItemType>>(rootItem,
22: copyTree(leftTreePtr–>rootPtr),
23: copyTree(rightTreePtr–>rootPtr))
24: {
25: } // end constructor
27: template<class ItemType>
28: BinaryNodeTree<ItemType>::
29: BinaryNodeTree(const BinaryNodeTree<ItemType>& treePtr)
30: {
31: rootPtr = copyTree(treePtr.rootPtr);
32: } // end copy constructor
34: template<class ItemType>
35: std::shared_ptr<BinaryNode<ItemType>> BinaryNodeTree<ItemType>::copyTree(
36: const std::shared_ptr<BinaryNode<ItemType>> oldTreeRootPtr) const
37: {
38: std::shared_ptr<BinaryNode<ItemType>> newTreePtr;
39:
40: // Copy tree nodes during a preorder traversal
41: if (oldTreeRootPtr != nullptr)
42: {
43: // Copy node
44: newTreePtr = std::make_shared<BinaryNode<ItemType>>(oldTreeRootPtr–>getItem(),
45: nullptr, nullptr);
46: newTreePtr–>setLeftChildPtr(copyTree(oldTreeRootPtr–>getLeftChildPtr()));
47: newTreePtr–>setRightChildPtr(copyTree(oldTreeRootPtr–>getRightChildPtr()));
48: } // end if
49: // Else tree is empty (newTreePtr is nullptr)
50:
51: return newTreePtr;
52: } // end copyTree