#include <iostream>using namespace std;template <class DataType>struct BiNode { DataType data; BiNode<DataType>* lchild, * rchild;};template <class DataType>class BiTree{private: BiNode<DataType>* root; ///指向根節點的頭指標 BiNode<DataType>* Creat(BiNode<DataType>* bt); ///建構函式調用 void Release(BiNode<DataType>* bt); ///解構函式調用 void PreOrder(BiNode<DataType>* bt); ///前序走訪函數調用 void InOrder(BiNode<DataType>* bt); ///中序遍曆函數調用 void PostOrder(BiNode<DataType>* bt); ///後序遍曆函數調用public: BiTree() { root = Creat(root); } ///建構函式,建立一棵二叉樹 ~BiTree() { Release(root); } ///解構函式,釋放各節點的儲存空間 void PreOrder() { PreOrder(root); } ///前序走訪二叉樹 void InOrder() { InOrder(root); } ///中序遍曆二叉樹 void PostOrder() { PostOrder(root); } ///後序遍曆二叉樹 void LeverOrder(); ///層序遍曆二叉樹};template <class DataType>BiNode<DataType>* BiTree<DataType>::Creat(BiNode<DataType>* bt) ///建立二叉樹{ char ch; cin >> ch; ///輸入資訊,假設為字元 if (ch == '#') bt = NULL; ///建立一棵空樹 else { bt = new BiNode; bt->data = ch; ///產生一個節點,資料域為ch bt->lchild = Creat(bt->lchild); ///遞迴建立左子樹 bt->rchild = Creat(bt->rchild); /// 遞迴建立右子樹 } return bt;}template <class DataType>void BiTree<DataType>::Release(BiNode<DataType>* bt) ///釋放二叉樹{ if (bt) { Release(bt->lchild); //釋放左子樹 Release(bt->rchild); ///釋放右子樹 delete bt; ///釋放根節點 }}template <class DataType> ///前序走訪函數調用void BiTree<DataType>::PreOrder(BiNode<DataType>* bt){ if (bt == NULL) ///遞迴調用的結束條件 return ; else { cout << bt->data; ///訪問根節點bt的資料域 PreOrder(bt->lchild); ///前序遞迴遍曆bt的左子樹 PreOrder(bt->rchild); ///前序遞迴遍曆bt的右子樹 }}template <class DataType> ///中序遍曆函數調用void BiTree<DataType>::InOrder(BiNode<DataType>* bt){ if (bt == NULL) ///遞迴調用的結束條件 return ; else { InOrder(bt->lchild); ///中序遞迴遍曆bt的左子樹 cout << bt->data; ///訪問根節點bt的資料域 InOrder(bt->rchild); ///中序遞迴遍曆bt的右子樹 }}template <class DataType> ///後序遍曆函數調用void BiTree<DataType>::PostOrder(BiNode<DataType>* bt){ if (bt == NULL) ///遞迴調用的結束條件 return ; else { PostOrder(bt->lchild); ///後序遞迴遍曆bt的左子樹 PostOrder(bt->rchild); ///後序遞迴遍曆bt的右子樹 cout << bt->data; ///訪問根節點bt的資料域 }}template <class DataType> ///層序遍曆函數調用void BiTree<DataType>::LeverOrder(){ int front = -1,rear = -1; ///採用順序隊列,並假定不會發生上溢 if (root == NULL) return ; ///二叉樹為空白,演算法結束 Q[++rear] = root; ///根指標入隊 while (front != rear) { ///當隊列非空時 q = Q[++front]; ///出隊 cout << q->data; if (q->lchild) Q[++rear] = q->lchild; if (q->rchild) Q[++rear] = q->rchild; }}int main(){ return 0;}