#include <stdio.h> struct Tree { char elem; Tree *lchild,*rchild; }; void GreatTree(Tree *&b) { char ch; scanf("%c",&ch); if(ch=='$') b=NULL; else { b=new Tree; b->elem=ch; GreatTree(b->lchild); GreatTree(b->rchild); } } void BeforeVisite(Tree *b) // 先序递归 { if(b) { printf("%c ",b->elem); BeforeVisite(b->lchild); BeforeVisite(b->rchild); } } void BeforeVisite1(Tree *b) //先序非递归 { Tree *stack[100]; int top=0; while (b || top) { while (b) { printf("%c ",b->elem); stack[top++]=b; b=b->lchild; } if(top>0) //栈非空 { b=stack[--top]; b=b->rchild; } } } void MidVisite(Tree *b) //中序递归 { if(b) { MidVisite(b->lchild); printf("%c ",b->elem); MidVisite(b->rchild); } } void MidVisite1(Tree *b) //中序非递归 { Tree *stack[100]; int top=0; while(b || top) { while (b) { stack[top++]=b; b=b->lchild; } if(top>0) { b=stack[--top]; printf("%c ",b->elem); b=b->rchild; } } } void BehVisite(Tree *b) //后序递归 { if(b) { BehVisite(b->lchild); BehVisite(b->rchild); printf("%c ",b->elem); } } void BehVisite1(Tree *b) //后序非递归 { Tree *stack[100]; int top; while (b || top) { stack[top++]=b; b=b->lchild; } if(top>0) { b=stack[--top]; b=b->rchild; printf("%c ",b->elem); } } int Count(Tree *b) //结点个数 { if(b==NULL) return 0; else return 1+Count(b->lchild)+Count(b->rchild); } int leaf(Tree *b,int &num) //叶子结点个数 { if(b) { if(b->lchild==NULL && b->rchild==NULL) num++; leaf(b->lchild,num); leaf(b->rchild,num); } return num; } int High(Tree *b) //树高 { if(b==NULL) return 0; int h1=High(b->lchild)+1; int h2=High(b->rchild)+1; return h1>h2?h1:h2; } int main() { Tree *t; GreatTree(t); BeforeVisite(t); printf("/n"); MidVisite(t); printf("/n"); BehVisite(t); printf("/n"); int point=Count(t); int lea=0; int hight=High(t); leaf(t,lea); printf("结点:%d/n",point); printf("叶子:%d/n",lea); printf("高度:%d/n",hight); return 0; }