/********************************* 对应教材5.5节,二叉树定义 **********************************/ #include <iostream> #include <cstring> using namespace std; template <typename DataType> struct BiNode{ DataType data; BiNode<DataType> *lchild,*rchild; }; template <typename DataType> class BiTree{ public: BiTree( ){root = Creat(root);} //构造函数一棵建立一棵二叉树 ~BiTree( ){Release(root);} //析构函数一棵空的二叉树 void PreOrder( ){PreOrder(root);}//前序遍历二叉树 void InOrder( ){InOrder(root);} //中序遍历二叉树 void PostOrder( ){PostOrder(root);}//后序遍历二叉树 void LeverOrder( ); //层序遍历二叉树 private: 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); //后序遍历函数调用 BiNode<DataType> *root; //根节点 }; //构造函数 template <typename DataType> BiNode<DataType> *BiTree<DataType> :: Creat(BiNode<DataType> *bt){ char ch; cin >> ch; //输入结点的数据信息,假设为字符 if (ch == '#') bt = NULL; //建立一棵空树 else { bt = new BiNode<DataType>; bt->data = ch; bt->lchild = Creat(bt->lchild); //递归建立左子树 bt->rchild = Creat(bt->rchild); //递归建立右子树 } return bt; } //析构函数 template <typename DataType> void BiTree<DataType> :: Release(BiNode<DataType> *bt) { if (bt == NULL) return; else{ Release(bt->lchild); //释放左子树 Release(bt->rchild); //释放右子树 delete bt; //释放根结点 } } //前序遍历函数 根左右 template <typename 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 <typename 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 <typename 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 <typename DataType> void BiTree<DataType> :: LeverOrder( ) { BiNode<DataType> *Q[100], *q = NULL; int front = -1, rear = -1; if (root == NULL) return; Q[++rear] = root; while (front != rear){ q = Q[++front]; cout << q->data; if (q->lchild != NULL) Q[++rear] = q->lchild; if (q->rchild != NULL) Q[++rear] = q->rchild; } } int main() { cout<<"请输入二叉树,#表示空:"; BiTree<char> T; cout<<endl; cout<<"该二叉树的前序遍历序列是:"; T.PreOrder(); cout<<endl; cout<<"该二叉树的中序遍历序列是:"; T.InOrder(); cout<<endl; cout<<"该二叉树的后序遍历序列是:"; T.PostOrder(); cout<<endl; cout<<"该二叉树的层序遍历序列是:"; T.LeverOrder(); cout<<endl; return 0; }
二叉树的结构: