C++ examples for Data Structure:Tree
Allowing Duplicates in Binary Trees
#include <iostream> template <typename NODETYPE> class Tree;/*from ww w . j a v a 2s. c o m*/ template <typename NODETYPE> class TreeNode { friend class Tree<NODETYPE>; public: explicit TreeNode(const NODETYPE &d) : leftPtr(0), data(d), rightPtr(0) {} NODETYPE getData() const { return data; } private: TreeNode<NODETYPE> *leftPtr; NODETYPE data; TreeNode<NODETYPE> *rightPtr; }; template <typename NODETYPE> class Tree { public: Tree(); void insertNode(const NODETYPE &); void preOrderTraversal() const; void inOrderTraversal() const; void postOrderTraversal() const; private: TreeNode<NODETYPE> *rootPtr; // utility functions void insertNodeHelper(TreeNode<NODETYPE> **, const NODETYPE &); void preOrderHelper(TreeNode<NODETYPE> *) const; void inOrderHelper(TreeNode<NODETYPE> *) const; void postOrderHelper(TreeNode<NODETYPE> *) const; }; template <typename NODETYPE> Tree<NODETYPE>::Tree() { rootPtr = 0; // indicate tree is initially empty } template <typename NODETYPE> void Tree<NODETYPE>::insertNode(const NODETYPE &value) { insertNodeHelper(&rootPtr, value); } template <typename NODETYPE> void Tree<NODETYPE>::insertNodeHelper(TreeNode<NODETYPE> **ptr, const NODETYPE &value) { if (*ptr == 0) { *ptr = new TreeNode<NODETYPE>(value); } else { if (value < (*ptr)->data) { insertNodeHelper(&((*ptr)->leftPtr), value); } else { if (value > (*ptr)->data) insertNodeHelper(&((*ptr)->rightPtr), value); } } } template <typename NODETYPE> void Tree<NODETYPE>::preOrderTraversal() const { preOrderHelper(rootPtr); } template <typename NODETYPE> void Tree<NODETYPE>::preOrderHelper(TreeNode<NODETYPE> *ptr) const { if (ptr != 0) { std::cout << ptr->data << ' '; // process node preOrderHelper(ptr->leftPtr); preOrderHelper(ptr->rightPtr); } } template <typename NODETYPE> void Tree<NODETYPE>::inOrderTraversal() const { inOrderHelper(rootPtr); } template <typename NODETYPE> void Tree<NODETYPE>::inOrderHelper(TreeNode<NODETYPE> *ptr) const { if (ptr != 0) { inOrderHelper(ptr->leftPtr); std::cout << ptr->data << ' '; inOrderHelper(ptr->rightPtr); } } template <typename NODETYPE> void Tree<NODETYPE>::postOrderTraversal() const { postOrderHelper(rootPtr); } template <typename NODETYPE> void Tree<NODETYPE>::postOrderHelper(TreeNode<NODETYPE> *ptr) const { if (ptr != 0) { postOrderHelper(ptr->leftPtr); postOrderHelper(ptr->rightPtr); std::cout << ptr->data << ' '; // process node } } #include <iostream> #include <iomanip> int main(int argc, const char* argv[]) { Tree<int> intTree; int intValue; std::cout << "Enter 10 integer values: "; // insert 10 integers to intTree for (int i = 0; i < 10; ++i) { std::cin >> intValue; intTree.insertNode(intValue); } std::cout << "\nPreorder traversal\n"; intTree.preOrderTraversal(); std::cout << "\nInorder traversal\n"; intTree.inOrderTraversal(); std::cout << "\nPostorder traversal\n"; intTree.postOrderTraversal(); return 0; }