二叉树的基本运算
二叉树的定义
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
#define MaxWidth 40
typedef char ElemType;
typedef struct tnode
{
ElemType data;
struct tnode *lchild,*rchild;
} BTNode;
由str创建二叉链
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];
}
}
求二叉树高度
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;
else
{ 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 DispBTree1(BTNode *bt)
{
BTNode *St[MaxSize],*p;
int Level[MaxSize][2],top=-1,n,i,width=4;
char type;
if (bt!=NULL)
{
top++;
St[top]=bt;
Level[top][0]=width;
Level[top][1]=2;
while (top>-1)
{
p=St[top];
n=Level[top][0];
switch(Level[top][1])
{
case 0:type='L';break;
case 1:type='R';break;
case 2:type='B';break;
}
for (i=1;i<=n;i++)
printf(" ");
printf("%c(%c)",p->data,type);
for (i=n+1;i<=MaxWidth;i+=2)
printf("━");
printf("\n");
top--;
if (p->rchild!=NULL)
{
top++;
St[top]=p->rchild;
Level[top][0]=n+width;
Level[top][1]=1;
}
if (p->lchild!=NULL)
{
top++;
St[top]=p->lchild;
Level[top][0]=n+width;
Level[top][1]=0;
}
}
}
}
main
void main()
{
BTNode *bt;
CreateBTree(bt,"A(B(D,E(G,H)),C(,F(I)))");
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凹入表示:\n");DispBTree1(bt);printf("\n");
}