#include<stdio.h>
#include<conio.h>
#include <cstdlib>
#include<malloc.h>
#define MAX 20
typedef struct BTNode
{ /*节点结构声明*/
char data ; /*节点数据*/
struct BTNode *lchild;
struct BTNode *rchild ; /*指针*/
}*BiTree;
void createBiTree(BiTree *t)
{ /* 先序遍历创建二叉树*/
char s;
BiTree q;
printf("\nplease input data:(exit for #)");
s=getche();
if(s=='#')
{
*t=NULL;
return;
}
q=(BiTree)malloc(sizeof(struct BTNode) );
if(q==NULL)
{
printf("Memory alloc failure!");
exit(0);
}
q->data=s;
*t=q;
createBiTree(&q->lchild); /*递归建立左子树*/
createBiTree(&q->rchild); /*递归建立右子树*/
}
void PreOrder(BiTree p)
{ /* 先序遍历二叉树*/
if ( p!= NULL )
{
printf("%c", p->data);
PreOrder( p->lchild ) ;
PreOrder( p->rchild) ;
}
}
void InOrder(BiTree p)
{ /* 中序遍历二叉树*/
if( p!= NULL )
{
InOrder( p->lchild ) ;
printf("%c", p->data);
InOrder( p->rchild) ;
}
}
void PostOrder(BiTree p)
{ /* 后序遍历二叉树*/
if ( p!= NULL )
{
PostOrder( p->lchild ) ;
PostOrder( p->rchild) ;
printf("%c", p->data);
}
}
void Preorder_n(BiTree p)
{ /*先序遍历的非递归算法*/
BiTree stack[MAX],q;
int top=0,i;
for(i=0;i<MAX;i++)
stack[i]=NULL;/*初始化栈*/
q=p;
while(q!=NULL)
{
printf("%c",q->data);
if(q->rchild!=NULL) stack[top++]=q->rchild;
if(q->lchild!=NULL) q=q->lchild;
else
if(top>0) q=stack[--top];
else q=NULL;
}
}
int NodeCount(Bitree *t)
{//统计二叉树中T的结点个数
if(T==Null) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
//否则结点个数为左子树的结点个数+ 右子树的结点个数+1
}
int Depth(BiTree *t)
{//计算二叉树T的深度
if(T==Null) return 0;
else
{
m=Depth(T->lchild);//递归计算左子树的深度
n=Depth(T->rchild);
if(m>n) return (m+1);//二叉树的深度2为m与n的较大者加1
else return (n+1);
}
}
void release(BiTree t)
{ /*释放二叉树空间*/
if(t!=NULL)
{
release(t->lchild);
release(t->rchild);
free(t);
}
}
int main()
{
BiTree t=NULL;
createBiTree(&t);
printf("\n\nPreOrder the tree is:");
PreOrder(t);
printf("\n\nInOrder the tree is:");
InOrder(t);
printf("\n\nPostOrder the tree is:");
PostOrder(t);
printf("\n\n先序遍历序列(非递归):");
Preorder_n(t);
NodeCount(Bitree T);
Depth(BiTree);
release(t);
return 0;
}