// bTreeNode.h<br />#include <iostream><br />template <class Type> class bTree;<br />template <class Type> class bTreeNode {<br />friend class bTree<Type>;<br />// this template class is not a common used template class<br />// it is used only in template class bTree<br />private:<br />bTreeNode(): data(Type()), lchild(NULL), rchild(NULL) { }<br />Type data;<br />bTreeNode* lchild;<br />bTreeNode* rchild;<br />};
// bTree.h<br />#include "bTreeNode.h"<br />template <class Type> class bTree {<br />public:<br />bTree() // constructor for first root input node,<br />{ // when left/right child is empty input child node<br /> // data '#'<br />root = new bTreeNode<Type>;<br />PreOrderCreate(root);<br />}<br />bTree(Type* q, int n)<br />{<br />root = new bTreeNode<Type>;<br />LeverCreate(root, q, 0, n);<br />}<br />void PrintPreOrder() // print preorder<br />{<br />PreOrder(root);<br />std::cout << std::endl;<br />}<br />void PrintInOrder() // print inorder<br />{<br />InOrder(root);<br />std::cout << std::endl;<br />}<br />void PrintPostOrder() // print postorder<br />{<br />PostOrder(root);<br />std::cout << std::endl;<br />}<br />private:<br />void PreOrderCreate(bTreeNode<Type>* p) // create tree preorder<br />{<br />std::cin >> p->data;<br />if ('#' != p->data)<br />{<br />p->lchild = new bTreeNode<Type>;<br />p->rchild = new bTreeNode<Type>;<br />PreOrderCreate(p->lchild);<br />if ('#' == p->lchild->data)<br />{<br />delete p->lchild;<br />p->lchild = NULL;<br />}<br />PreOrderCreate(p->rchild);<br />if ('#' == p->rchild->data)<br />{<br />delete p->rchild;<br />p->rchild = NULL;<br />}<br />}<br />else<br />{<br />}<br />}<br />void LeverCreate(bTreeNode<Type>* p, Type* q, int i, int n)<br />{<br />if ('#' != q[i] && i < n)<br />{<br />p->data = q[i];<br />p->lchild = new bTreeNode<Type>;<br />p->rchild = new bTreeNode<Type>;<br />LeverCreate(p->lchild, q, 2 * i + 1, n);<br />if ('/0' == p->lchild->data)<br />{<br />delete p->lchild;<br />p->lchild = NULL;<br />}<br />LeverCreate(p->rchild, q, 2 * i + 2, n);<br />if ('/0' == p->rchild->data)<br />{<br />delete p->rchild;<br />p->rchild = NULL;<br />}<br />}<br />}<br />void PreOrder(bTreeNode<Type>* p) // first root print<br />{<br />if (NULL != p)<br />{<br />std::cout << p->data << " ";<br />PreOrder(p->lchild);<br />PreOrder(p->rchild);<br />}<br />}<br />void InOrder(bTreeNode<Type>* p) // middle root print<br />{<br />if (NULL != p)<br />{<br />InOrder(p->lchild);<br />std::cout << p->data << " ";<br />InOrder(p->rchild);<br />}<br />}<br />void PostOrder(bTreeNode<Type>* p) // post-root print<br />{<br />if (NULL != p)<br />{<br />PostOrder(p->lchild);<br />PostOrder(p->rchild);<br />std::cout << p->data << " ";<br />}<br />}<br />private:<br />bTreeNode<Type>* root;<br />};
// main.cpp<br />#include "bTree.h"<br />int main()<br />{<br />// the below three trees is one tree<br />// '#' means a node has no left/right child<br />// one lever array store.<br />char* cc = "abcdeg###f##h";<br />bTree<char> a(cc, 13);<br />a.PrintPreOrder();<br />a.PrintInOrder();<br />a.PrintPostOrder();<br />// first root<br />// enter abd##ef###cg#h###<br />bTree<char> b;<br />b.PrintPreOrder();<br />b.PrintInOrder();<br />b.PrintPostOrder();<br />// '#' asc code is equal to 35<br />// a b d # # e f # # # c g # h # # #<br />// 97 98 100 35 35 101 102 35 35 35 99 103 35 104 35 35 35<br />bTree<int> c;<br />c.PrintPreOrder();<br />c.PrintInOrder();<br />c.PrintPostOrder();<br />return 0;<br />}