#pragma once #include template class DopeBinTreeNode{ DopeBinTreeNode* left; DopeBinTreeNode* right; T data; public: DopeBinTreeNode(T data); ~DopeBinTreeNode(); void SetLeft(DopeBinTreeNode* newleft){left = newleft;} void SetRight(DopeBinTreeNode* newright){right = newright;} DopeBinTreeNode* GetLeft(){return left;} DopeBinTreeNode* GetRight(){return right;} T GetData(){return data;} }; template class DopeBinTree{ DopeBinTreeNode* root; T* RecPreOrderTraversal(DopeBinTreeNode* node, T* out); T* RecInOrderTraversal(DopeBinTreeNode* node, T* out); T* RecPostOrderTraversal(DopeBinTreeNode* node, T* out); public: DopeBinTree(T data); DopeBinTree(); ~DopeBinTree(); void insert(T data); bool isEmpty(); DopeBinTreeNode* getRoot(){return root;} void RecPreOrderTraversalArray(T* array); void RecInOrderTraversalArray(T* array); void RecPostOrderTraversalArray(T* array); }; // Implementations ___________________________________________________ template DopeBinTreeNode::DopeBinTreeNode(T node_data): left(nullptr), right(nullptr), data(node_data) { } template DopeBinTreeNode::~DopeBinTreeNode(){ delete left; delete right; } template DopeBinTree::DopeBinTree(T data){ root = new DopeBinTreeNode(data); } template DopeBinTree::DopeBinTree(): root(nullptr) { } template DopeBinTree::~DopeBinTree(){ if (root != nullptr){ delete root; } } template // Insert Breadth first void DopeBinTree::insert(T data){ DopeBinTreeNode* current_node = root; if (root == nullptr){ root = new DopeBinTreeNode(data); } else { auto new_node = new DopeBinTreeNode(data); // Breadth first traversal std::queue*> q; q.push(root); while(!q.empty()){ current_node = q.front(); q.pop(); if(current_node->GetLeft()){ q.push(current_node->GetLeft()); } else { current_node->SetLeft(new_node); break; } if(current_node->GetRight()){ q.push(current_node->GetRight()); } else { current_node->SetRight(new_node); break; } } } } template bool DopeBinTree::isEmpty(){ if(root == nullptr){ return true; } else { return false; } } template T* DopeBinTree::RecPreOrderTraversal(DopeBinTreeNode* node, T* out){ if (node == nullptr){ return out--; } *out = node->GetData(); out++; out = RecPreOrderTraversal(node->GetLeft(), out); out = RecPreOrderTraversal(node->GetRight(), out); return out; } template T* DopeBinTree::RecInOrderTraversal(DopeBinTreeNode* node, T* out){ if (node == nullptr){ return out--; } out = RecInOrderTraversal(node->GetLeft(), out); *out = node->GetData(); out++; out = RecInOrderTraversal(node->GetRight(), out); return out; } template T* DopeBinTree::RecPostOrderTraversal(DopeBinTreeNode* node, T* out){ if (node == nullptr){ return out--; } out = RecPostOrderTraversal(node->GetLeft(), out); out = RecPostOrderTraversal(node->GetRight(), out); *out = node->GetData(); out++; return out; } template void DopeBinTree::RecPreOrderTraversalArray(T* array){ int index = 0; DopeBinTreeNode* node = root; RecPreOrderTraversal(node, &array[index]); } template void DopeBinTree::RecInOrderTraversalArray(T* array){ int index = 0; DopeBinTreeNode* node = root; RecInOrderTraversal(node, &array[index]); } template void DopeBinTree::RecPostOrderTraversalArray(T* array){ int index = 0; DopeBinTreeNode* node = root; RecPostOrderTraversal(node, &array[index]); }