#include<iostream> #include<cstdio> #include<malloc.h> #define OVERFLOW -2 typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree &L){ char ch; scanf("%c",&ch); if(ch=='#')L=NULL; else{ L=(BiTree)malloc(sizeof(BiTNode)); if(!L)exit(OVERFLOW); L->data=ch; CreateBiTree(L->lchild); CreateBiTree(L->rchild); } } void PreOrderTraverse(BiTree L){ if(L){ printf("%c",L->data); PreOrderTraverse(L->lchild); PreOrderTraverse(L->rchild); } } void PostOrderTraverse(BiTree L){ if(L){ PostOrderTraverse(L->lchild); PostOrderTraverse(L->rchild); printf("%c",L->data); } } void InOrderTraverse(BiTree L){ if(L){ InOrderTraverse(L->lchild); printf("%c",L->data); InOrderTraverse(L->rchild); } } int Depth(BiTree L){ int d1,d2,d3; if(!L)d1=0; else{ d2=Depth(L->lchild); d3=Depth(L->rchild); d1=1+(d2>d3?d2:d3); } return d1; } int Leaf(BiTree L,int &c){ if(L!=NULL){//在树不为空的时候才能讨论左右结点 if(L->lchild==NULL&&L->rchild==NULL)c++; Leaf(L->lchild,c); Leaf(L->rchild,c); } return c; } void GetFloor(BiTree L,char data,int floor,int &res){ if(L!=NULL){ if(L->data==data){ res=floor; } GetFloor(L->lchild,data,floor+1,res); GetFloor(L->rchild,data,floor+1,res); } } int c=0; void Count(BiTree L){ if(L!=NULL){ c++; Count(L->lchild); Count(L->rchild); } } int main(){ BiTree T; CreateBiTree(T); printf("先序遍历序列为:\n"); PreOrderTraverse(T); printf("\n中序遍历序列为:\n"); InOrderTraverse(T); printf("\n后序遍历序列为:\n"); PostOrderTraverse(T); printf("\n高度:%d\n",Depth(T)); int m=0; Leaf(T,m); printf("叶子数:%d\n",m); int floor=1,res; GetFloor(T,'D',floor,res); printf("在第%d层\n",res); Count(T); printf("一共有%d个结点\n",c); }