#include<iostream>
using namespace std;
#include<stdlib.h>
#include<math.h>
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)//按先序次序输入二叉树中结点的值(一个字符),#字符表示空树,构造二叉链表表示的二叉树T
{
TElemType ch;
cin>>ch;//输入二叉树中结点的值(一个字符)
if(ch=='#')//#字符表示空树
{
T=NULL;
}
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch;//如果输入不为空格,将字符赋值给二叉树中结点
CreateBiTree(T->lchild);//创建该结点左儿子
CreateBiTree(T->rchild);//创建该结点右儿子
}
}
void PreOrderTraverse(BiTree T)//先序遍历
{
if(T==NULL) return;
cout<<T->data<<'\t';
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
void InOrderTraverse(BiTree T)//中序遍历
{
if(T==NULL) return;
InOrderTraverse(T->lchild);
cout<<T->data<<'\t';
InOrderTraverse(T->rchild);
}
void PostOrderTraverse(BiTree T)//后序遍历
{
if(T==NULL) return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data<<'\t';
}
int BiTreeDepth(BiTree T)
{
if(T->lchild==NULL&&T->rchild==NULL) return 1;
else if(T->lchild==NULL&&T->rchild!=NULL)return BiTreeDepth(T->rchild)+1;
else if(T->lchild!=NULL&&T->rchild==NULL)return BiTreeDepth(T->lchild)+1;
else return fmax(BiTreeDepth(T->lchild),BiTreeDepth(T->rchild))+1;
}
int NodeCount(BiTree T)
{
if(T==NULL)return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int LeadCount(BiTree T)//树的叶子结点数
{
if(T==NULL)return 0;
if(T->lchild==NULL&&T->rchild==NULL)return 1;
else return LeadCount(T->lchild)+LeadCount(T->rchild);
}
int main()
{
BiTree T;
CreateBiTree(T);
cout<<"树的深度:"<<BiTreeDepth(T)<<endl;
cout<<"树的结点数:"<<NodeCount(T)<<endl;
cout<<"树的叶子结点数:"<<LeadCount(T)<<endl;
cout<<"先序遍历:"<<endl;
PreOrderTraverse(T);
cout<<endl<<"中序遍历:"<<endl;
InOrderTraverse(T);
cout<<endl<<"后序遍历:"<<endl;
PostOrderTraverse(T);
}
/*ABC##DE#G##F###*/