text: /*
  例程61. 二叉树的遍历.c
  整理优化by:千百度QAIU
  QQ:736226400
  编译环境:gcc/tcc
  */
  #include <conio.h>
  #include <stdlib.h>
  typedef struct bitnode
  {
  	char data;
  	struct bitnode *lchild, *rchild;
  }bitnode, *bitree;
  
  void createbitree(bitnode ** t,int *n)
  {
  	char x;
  	bitnode *q;
  
  	*n=*n+1;
  	printf(" Input  %d  DATA: ",*n);
  	x=getchar();
  	if(x!='\n') getchar();
  
  	if (x=='#')
  	return;
  
  	q=(bitnode*)malloc(sizeof(bitnode));
  	q->data=x;
  	q->lchild=NULL;
  	q->rchild=NULL;
  	*t=q;
  
  	printf("This Address is:%o,Data is:%c, Left Pointer is:%o,Right Pointer is:  %o\n",q,q->data,q->lchild,q->rchild);
  
  	createbitree(&q->lchild,n);
  	createbitree(&q->rchild,n);
  	return;
  }
  
  void visit(bitnode *e)
  {
  	printf("  Address:  %o,  Data:  %c,  Left Pointer:  %o,  Right Pointer:  %o\n",e,e->data,e->lchild,e->rchild);
  }
  
  void preordertraverse(bitnode *t)
  {
  	if(t)
  	{
  		visit(t);
  		preordertraverse(t->lchild);
  		preordertraverse(t->rchild);
  		return ;
  	}else return ;
  }
  
  void countleaf(bitnode *t,int *c)
  {
  	if(t!=NULL)
    	{
  		  if (t->lchild==NULL && t->rchild==NULL)
  		  {
  		  	*c=*c+1;
  		  }
     		countleaf(t->lchild,c);
     		countleaf(t->rchild,c);
    	}
   	return;
  }
  
  int treehigh(bitnode *t)
  {
  	 int lh,rh,h;
   	 if(t==NULL)
  	 	h=0;
  	 else
  	 {
  	 	lh=treehigh(t->lchild);
  	 	rh=treehigh(t->rchild);
  	 	h=(lh>rh ? lh:rh)+1;
  	 }
  
  	 return h;
  }
  main()
  {
  	bitnode *t; int count=0;
  	int n=0;
  	clrscr();
  	printf("Please initialize the TREE!\n");
  	createbitree(&t,&n);
  
  	printf("\n This is TREE Struct:\n");
  	preordertraverse(t);
  
  	countleaf(t,&count);
  	printf(" This TREE has %d leaves.",count);
  
  	printf("\n High of The TREE is: %d\n",treehigh(t));
  	puts("\n Press any key to quit...");
  	getch();
  }