问题描述
(1)根据二叉树的括号表示法建立二叉树
(2)根据二叉树获取其括号表示法字符串
(3)输出二叉树的深度
(4)输出二叉树的宽度
(5)输出二叉树的结点的个数
(6)输出二叉树叶子结点的个数
代码
# include<stdio.h>
# include<malloc.h>
# include<string.h>
#define MAX 100
typedef struct BiNode{
char data;
int cs;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
typedef struct{
BiTree data[MAX];
int top;
}Stack;
typedef struct{
BiTree data[MAX];
int front,rear;
}Queue;
void InitStack(Stack &s);
int isFull(Stack s);
int isEmpty(Stack s);
int Push(Stack &s,BiTree p);
int Pop(Stack &s);
int getTop(Stack &s,BiTree &p);
int createBiTree(BiTree &T,char str[]);
BiTree newnode(char c);
void printBiTree(BiTree T);
int getHeight(BiTree T);
int getWidth(BiTree T);
void getNum(BiTree T,int &num1,int &num2);
void InitQueue(Queue &q);
int EnQueue(Queue &q,BiTree t);
BiTree DeQueue(Queue &q);
int main()
{
int num1,num2;
char khdata[MAX];
printf("请输入二叉树的括号表示法:\n");
scanf("%s",khdata);
BiTree T=NULL;
int t=createBiTree(T,khdata);
if(t==1)
printf("二叉树建立成功!\n");
else
{
printf("二叉树建立失败!\n");
return 0;
}
printf("根据所建二叉树获得括号表示法字符串:");
printBiTree(T);
printf("\n树的深度为:%d\n",getHeight(T));
printf("树的宽度为:%d\n",getWidth(T));
getNum(T,num1,num2);
printf("二叉树的结点的个数为:%d,叶子结点的个数为:%d\n",num1,num2);
return 0;
}
int createBiTree(BiTree &T,char str[])
{
int i=0;
Stack s;
InitStack(s);
if(strlen(str)==0)
{
T=NULL;
return 0;
}
T=newnode(str[i++]);
BiTree t=T;
Push(s,T);
while(i<strlen(str)||(getTop(s,t)&&t!=T))
{
switch(str[i])
{
case '(':
if(str[i+1]!=',')
{
t->lchild=newnode(str[i+1]);
Push(s,t->lchild);
t=t->lchild;
i=i+2;
}
else
{
Push(s,NULL);
i++;
}
break;
case ',':
Pop(s);
getTop(s,t);
t->rchild=newnode(str[i+1]);
Push(s,t->rchild);
t=t->rchild;
i=i+2;
break;
case ')':
Pop(s);
i++;
break;
}
}
return 1;
}
void printBiTree(BiTree T)
{
if(T==NULL)
return ;
printf("%c",T->data);
if(T->lchild==NULL&&T->rchild==NULL)
{
return ;
}
else
{
printf("(");
if(T->lchild!=NULL)
printBiTree(T->lchild);
if(T->rchild!=NULL)
{
printf(",");
printBiTree(T->rchild);
}
printf(")");
}
}
int getHeight(BiTree T)
{
if(T==NULL)
return 0;
else{
return (getHeight(T->lchild)>getHeight(T->rchild)?getHeight(T->lchild):getHeight(T->rchild))+1;
}
}
int getWidth(BiTree T)
{
int num[MAX];
memset(num,0,sizeof(num));
if(T==NULL)
return 0;
else
{
Queue q;
BiTree t=NULL;
InitQueue(q);
EnQueue(q,T);
T->cs=1;
num[T->cs]++;
while(!(q.front==q.rear&&q.data[q.front]==0))
{
t=DeQueue(q);
if(t->lchild)
{
t->lchild->cs=t->cs+1;
num[t->lchild->cs]++;
EnQueue(q,t->lchild);
}
if(t->rchild)
{
t->rchild->cs=t->cs+1;
num[t->rchild->cs]++;
EnQueue(q,t->rchild);
}
}
int i,max=0;
for(i=1;num[i];i++)
{
if(num[i]>max)
max=num[i];
}
return max;
}
}
void getNum(BiTree T,int &num1,int &num2)
{
num1=0;num2=0;
if(T==NULL)
{
return ;
}
else
{
Stack s;
InitStack(s);
Push(s,T);
num1++;
if(T->lchild==NULL&&T->rchild==NULL)
num2++;
BiTree t=T;
while(!isEmpty(s))
{
while(t)
{
Push(s,t->lchild);
if(t->lchild)
{
num1++;
if(t->lchild->lchild==NULL&&t->lchild->rchild==NULL)
num2++;
}
t=t->lchild;
}
Pop(s);
if(!isEmpty(s))
{
getTop(s,t);
Pop(s);
Push(s,t->rchild);
if(t->rchild)
{
num1++;
if(t->rchild->lchild==NULL&&t->rchild->rchild==NULL)
num2++;
}
t=t->rchild;
}
}
}
}
int Push(Stack &s,BiTree p)
{
if(isFull(s))
return 0;
else
{
s.data[s.top]=p;
s.top++;
return 1;
}
}
int Pop(Stack &s)
{
if(isEmpty(s))
return 0;
else
{
s.top--;
return 1;
}
}
int getTop(Stack &s,BiTree &p)
{
if(isEmpty(s))
return 0;
else
{
p=s.data[s.top-1];
return 1;
}
}
BiTree newnode(char c)
{
BiTree t=(BiTree)malloc(sizeof(BiNode));
t->data=c;
t->lchild=t->rchild=NULL;
return t;
}
void InitStack(Stack &s)
{
s.top=0;
}
int isFull(Stack s)
{
if(s.top>=MAX)
return 1;
else
return 0;
}
int isEmpty(Stack s)
{
if(s.top==0)
return 1;
else
return 0;
}
void InitQueue(Queue &q)
{
q.front=q.rear=0;
memset(q.data,0,MAX*sizeof(char));
}
int EnQueue(Queue &q,BiTree t)
{
if(q.front==q.rear&&q.data[q.front]!=0)
return 0;
else
{
q.data[q.rear]=t;
q.rear=(q.rear+1)%MAX;
return 1;
}
}
BiTree DeQueue(Queue &q)
{
BiTree t=q.data[q.front];
q.data[q.front]=0;
q.front=(q.front+1)%MAX;
return t;
}
运行结果