#include <iostream>#include <stack>using namespace std;template <class ElemType> // 二叉链表结点结构struct BTNode{ ElemType data; BTNode<ElemType> *lchild, *rchild;};//二叉链表类template<class ElemType>class BinaryTree{public: //构造函数 BinaryTree():m_root(NULL){} //按以先序次序输入结点值的方式建立二叉树 void _Create(BTNode<ElemType> * &T,ElemType ch[],const ElemType &c,int &i); //按先序次序输入结点值的方式建立二叉树的接口函数 void Create(ElemType ch[], const ElemType &c); //求叶子结点个数 int _Leaf(BTNode<ElemType> *T); //求叶子结点个数的接口函数 int Leaf() { return _Leaf(m_root); } //求二叉树的深度 int _Depth(BTNode<ElemType>*); //求二叉树的深度的接口函数 int Depth() { return _Depth(m_root); } //先序递归遍历二叉树 void _PreorderTraverse(BTNode<ElemType>*T,void (*visit)(const ElemType &e)); //先序递归遍历二叉树的接口函数 void PreorderTraverse() { _PreorderTraverse(m_root,visit); } //中序递归遍历二叉树 void _InorderTraverse(BTNode<ElemType>*T); //中序递归遍历二叉树的接口函数 void InorderTraverse() { _InorderTraverse(m_root); } //后序递归遍历二叉树 void _PostorderTraverse(BTNode<ElemType>*T); //后序递归遍历二叉树的接口函数 void PostorderTraverse () { _PostorderTraverse(m_root); } //先序非递归遍历二叉树 void PreorderTraverseNonRecursive(); //计算二叉树中结点值为奇数的结点个数 int _CountOdd(BTNode<ElemType> *T); //计算二叉树中结点值为奇数的结点个数的接口函数 int CountOdd() { int NumOdd=_CountOdd(m_root); return NumOdd; } //以广义表形式输出二叉树 void _Print(BTNode<ElemType> *T); //以广义表形式输出二叉树的接口函数 void Print() { _Print(m_root); }private: BTNode<ElemType> *m_root; };//按先序次序输入结点值的方式建立二叉树template <class ElemType>void BinaryTree<ElemType>:: _Create(BTNode<ElemType> * &T,ElemType ch[],const ElemType &c,int &i){ if(ch[i]==c) T=NULL; else{ T=new BTNode<ElemType>; T->data=ch[i]; _Create(T->lchild,ch,c,++i); _Create(T->rchild,ch,c,++i); }}//按先序次序输出结点值的方式建立二叉树的接口函数template<class ElemType>void BinaryTree<ElemType>::Create(ElemType ch[],const ElemType &c){ int i=0; _Create(m_root,ch,c,i);}//求二叉树的深度template <class ElemType>int BinaryTree<ElemType>::_Depth(BTNode<ElemType>* T){if(!T)return 0;int h1,h2;h1=_Depth(T->lchild);h2=_Depth(T->rchild);return h1>h2?h1+1:h2+1;}//先序递归遍历二叉树template <class ElemType>void BinaryTree<ElemType>::_PreorderTraverse(BTNode<ElemType>*T,void(*visit)(const ElemType &e)){ if(T){ visit(T->data); _PreorderTraverse(T->lchild,visit); _PreorderTraverse(T->rchild,visit); }}//中序递归遍历二叉树template <class ElemType>void BinaryTree<ElemType>::_InorderTraverse(BTNode<ElemType>*T,void (*visit)(const ElemType &e)){ if(T){ _InorderTraverse(T->lchild,visit); visit(T->data); _InorderTraverse(T->rchild,visit); }}//后序递归遍历二叉树template <class ElemType>void BinaryTree<ElemType>::_PostorderTraverse(BTNode<ElemType>*T){ if(T){ _PostorderTraverse(T->lchild,visit); -PostorderTraverse(T->rchild,visit); visit(T->data); }}//先序遍历的非递归遍历二叉树template<class ElemType>void BinaryTree<ElemType>::PreorderTraverseNonRecursive(){stack<BTNode<ElemType> *> S;BTNode<ElemType> *p;S.push (m_root);while (!S.empty ()) {p = S.top ();while (p) {visit(p->data);p = p->lchild;S.push(p); // 向左走到尽头}S.pop(); // 空指针退栈if (!S.empty()){p = S.top ();S.pop();S.push(p->rchild);}}}//求二叉树叶子结点个数template<class ElemType>int BinaryTree<ElemType>::_Leaf(BTNode<ElemType> *T){ if(T==NULL) return 0; else if(T->lchild==NULL&&T->rchild==NULL) return 1; else return _Leaf(T->lchild)+_Leaf(T->rchild);}//计算二叉树中结点值(如果是字符,则应为字符ASCII码值)为奇数的结点个数template<class ElemType>int BinaryTree<ElemType>::_CountOdd(BTNode<ElemType> *T){ static int a=1; if(T==NULL) return 0; else{ if(T->data%2!=0){ a++; _CountOdd(T->lchild); _CountOdd(T->rchild); } } return a;}//以广义表形式输出二叉树template <class ElemType> void BinaryTree<ElemType>::_Print(BTNode<ElemType> *T){ if(T) { cout<<T->data; if(T->lchild!=NULL||T->rchild!=NULL) { cout<<"("; _Print(T->lchild); if(T->rchild!=NULL) cout<<","; _Print(T->rchild); cout<<")"; } }}//主函数int main(){ BinaryTree<char>b; char ch[50],c; cout<<"请输入序列"<<endl; cin>>ch; cout<<"请输入特殊字符"<<endl; cin>>c; b.Create(ch,c); cout<<"建立的二叉树为 "<<endl; b.Print(); cout<<"奇结点个数"<<b.CountOdd()<<endl; b.PreorderTraverse(); cout<<"先序非递归"<<endl; b.Print(); cout<<"叶子结点个数"<<b.Leaf<<endl; return 0;}