exp6-1.cpp
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string>
#define MaxSize 100
typedef char ElemType;
typedef struct tnode
{
ElemType data;
struct tnode *lchild,*rchild;
} BTNode;
void CreateBTree(BTNode *&bt,char *str)
{
BTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
bt=NULL;
ch=str[j];
while (ch!='\0')
{
switch(ch)
{
case '(':top++;St[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if (bt==NULL)
bt=p;
else
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
void DestroyBTree(BTNode *&bt)
{
if (bt!=NULL)
{
DestroyBTree(bt->lchild);
DestroyBTree(bt->rchild);
free(bt);
}
}
int BTHeight(BTNode *bt)
{
int lchilddep,rchilddep;
if (bt==NULL) return(0);
else
{
lchilddep=BTHeight(bt->lchild);
rchilddep=BTHeight(bt->rchild);
return (lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1);
}
}
int NodeCount(BTNode *bt)
{
int num1,num2;
if (bt==NULL) return 0;
else
{
num1=NodeCount(bt->lchild);
num2=NodeCount(bt->rchild);
return (num1+num2+1);
}
}
int LeafCount(BTNode *bt)
{
int num1,num2;
if (bt==NULL) return 0;
else if (bt->lchild==NULL && bt->rchild==NULL) return 1;
{
num1=LeafCount(bt->lchild);
num2=LeafCount(bt->rchild);
return (num1+num2);
}
}
void DispBTree(BTNode *bt)
{
if (bt!=NULL)
{
printf("%c",bt->data);
if (bt->lchild!=NULL || bt->rchild!=NULL)
{
printf("(");
DispBTree(bt->lchild);
if (bt->rchild!=NULL)
printf(",");
DispBTree(bt->rchild);
printf(")");
}
}
}
void PreOrder(BTNode *bt)
{
if (bt!=NULL)
{
printf("%c",bt->data);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
void InOrder(BTNode *bt)
{
if (bt!=NULL)
{
InOrder(bt->lchild);
printf("%c",bt->data);
InOrder(bt->rchild);
}
}
void PostOrder(BTNode *bt)
{
if (bt!=NULL)
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
printf("%c",bt->data);
}
}
void LevelOrder(BTNode *bt)
{
BTNode *p;
BTNode *qu[MaxSize];
int front,rear;
front=rear=0;
rear++;qu[rear]=bt;
while (front!=rear)
{
front=(front+1)%MaxSize;
p=qu[front];
printf("%c",p->data);
if (p->lchild!=NULL)
{
rear=(rear+1)%MaxSize;
qu[rear]=p->lchild;
}
if (p->rchild!=NULL)
{
rear=(rear+1)%MaxSize;
qu[rear]=p->rchild;
}
}
}
int main()
{
BTNode *bt;
CreateBTree(bt,"A(B(D,E(G,H)),C(,F(K)))");
printf("二叉树bt:");DispBTree(bt);printf("\n");
printf("bt的高度:%d\n",BTHeight(bt));
printf("bt的结点数:%d\n",NodeCount(bt));
printf("bt的叶子结点数:%d\n",LeafCount(bt));
printf("bt的先序遍历序列:");PreOrder(bt);printf("\n");
printf("bt的中序遍历序列:");InOrder(bt);printf("\n");
printf("bt的后序遍历序列:");PostOrder(bt);printf("\n");
printf("bt的层次遍历序列:");LevelOrder(bt);printf("\n");
DestroyBTree(bt);
}
运行结果截图: