#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR 0
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data; /*结点的数据元素*/
struct node *lchild; /*指向左孩子*/
struct node *rchild; /*指向右孩子*/
}BTNode; /*定义二叉树存储结构*/
/*建立二叉树*/
BTNode *CreateBTNode(char *nodes,int pos,int num)
{
BTNode *p;
if(nodes[pos]=='\0'||pos>num)
return NULL;
p=(BTNode *)malloc(sizeof(BTNode)); /*建立根结点*/
if(!p)
return ERROR;
p->data=nodes[pos];
p->lchild=CreateBTNode(nodes,2*pos,num); /*递归建立左子树*/
p->rchild=CreateBTNode(nodes,2*pos+1,num); /*递归建立右子树*/
return p;
}
/*非递归中序遍历二叉树*/
void InOrder(BTNode *b)
{
BTNode *st[MaxSize],*p;
int top=-1;
if(b!=NULL)
{
p=b;
while(top>-1||p!=NULL)
{
while(p!=NULL)
{
top++;
st[top]=p;
p=p->lchild;
}
if(top>-1)
{
p=st[top];
top--;
printf("%c",p->data);
p=p->rchild;
}
}
printf("\n");
}
}
/*递归中序遍历二叉树*/
void InOrder1(BTNode *b)
{
if(b!=NULL)
{
InOrder1(b->lchild); /*递归遍历左子树*/
printf("%c",b->data);
InOrder1(b->rchild); /*递归遍历右子树*/
}
}
/*求二叉树的高度*/
int BTNodeDepth(BTNode *b)
{
int lchilddep,rchilddep;
if(b==NULL)
return 0;
else
{
lchilddep=BTNodeDepth(b->lchild); /*求左子树的高度*/
rchilddep=BTNodeDepth(b->rchild); /*求右子树的高度*/
if(lchilddep>rchilddep)
return lchilddep+1;
else
return rchilddep+1;
}
}
/*用分层形式输出二叉树*/
void DispBTNode(BTNode *b)
{
BTNode *qu[MaxSize];
BTNode *p;
int front,rear,n;
n=0;
front=rear=0;
qu[rear++]=NULL;
p=b;
if(p!=NULL)
qu[rear++]=p;
do{
p=qu[front++];
if(p==NULL)
{
qu[rear++]=NULL;
n++;
printf("\n");
}
else
{
printf("(%d,%2c)",n,p->data);
if(p->lchild!=NULL)
qu[rear++]=p->lchild;
if(p->rchild!=NULL)
qu[rear++]=p->rchild;
}
}while(front!=rear-1);
}
void main()
{
BTNode *b;
char nodes[]="#ABCDEF##G##H###"; /*直接用数组生成二叉树*/
b=CreateBTNode(nodes,1,15);
printf("\n");
DispBTNode(b);
printf("\n");
getch();
printf("InOrder: ");
InOrder(b);
getch();
printf("InOrder1:");
InOrder1(b);
getch();
printf("\n");
printf("Depth:%d\n",BTNodeDepth(b));
getch();
}