您的位置:首页 > 其它

求二叉树有多少个度为2、0的结点

2013-12-23 19:28 253 查看
#include<stdio.h>
#include<malloc.h>
//2013-12-23
//乾卦
#define MAX 256
typedef struct Node
{
char data;
struct Node *rchild;
struct Node *lchild;
}BTNode;
//创建二叉树
void CreatBT(BTNode *&root,char *str)
{
int top=0;
int j=0;
BTNode *st[MAX];
BTNode *p=NULL;
int flg=0;
root=NULL;
while(str[j]!='\0')
{
if(str[j]=='(')
{
top++;
st[top]=p;
flg=1;
}
else if(str[j]==')')
{
top--;
}
else if(str[j]==',')
{
flg=2;
}
else
{
p=(BTNode*)malloc(sizeof(BTNode));
if(!p)
{
printf("申请空间失败!\n");
return ;
}
p->data=str[j];
p->lchild=NULL;
p->rchild=NULL;
if(!root)
{
root=p;
}
else
{
if(flg==1)
st[top]->lchild=p;
if(flg==2)
st[top]->rchild=p;
}
}
j++;
}

return ;
}
//求二叉树有多少个度为2的结点
int Func(BTNode *root)
{
int flg=0;
int count=0;
BTNode* queue[MAX];
BTNode* p=NULL;
int rear=-1,front=-1;

if(!root)
return -1;
rear++;
queue[rear]=root;
while(rear!=front)
{
front++;
p=queue[front];
flg=0;
if(p->lchild)
{
//进队
rear++;
queue[rear]=p->lchild;
flg++;
}
if(p->rchild)
{
rear++;
queue[rear]=p->rchild;
flg++;
}
if(2==flg)
count++;
}

return count;
}

void main()
{
int i;
BTNode *ROOT=NULL;
CreatBT(ROOT,"A(B(D(,G)),C(E,F))");
i=Func(ROOT);
printf("一共有%d个度为2的结点\n",i);
//完全二叉树 1+2+1=4
CreatBT(ROOT,"A(B(D(H,I),E),C(F,G))");
i=Func(ROOT);
printf("一共有%d个度为2的结点\n",i);
//高度为4的满二叉树 1+2+4=7
CreatBT(ROOT,"A(B(D(H,I),E(J,K)),C(F(L,M),G(N,O)))");
i=Func(ROOT);
printf("一共有%d个度为2的结点\n",i);
//0
CreatBT(ROOT,"A(,B(C(,D(E))))");
i=Func(ROOT);
printf("一共有%d个度为2的结点\n",i);
//0
CreatBT(ROOT,"A(B,)");
i=Func(ROOT);
printf("一共有%d个度为2的结点\n",i);
//
CreatBT(ROOT,"A(B(D,E),C(F(H(J,K),I),G))");
i=Func(ROOT);
printf("一共有%d个度为2的结点\n",i);
return ;
}




#include<stdio.h>
#include<malloc.h>
//2013-12-24
//乾卦
#define MAX 256
typedef struct Node
{
char data;
struct Node *rchild;
struct Node *lchild;
}BTNode;
//创建二叉树
void CreatBT(BTNode *&root,char *str)
{
int top=0;
int j=0;
BTNode *st[MAX];
BTNode *p=NULL;
int flg=0;
root=NULL;
while(str[j]!='\0')
{
if(str[j]=='(')
{
top++;
st[top]=p;
flg=1;
}
else if(str[j]==')')
{
top--;
}
else if(str[j]==',')
{
flg=2;
}
else
{
p=(BTNode*)malloc(sizeof(BTNode));
if(!p)
{
printf("申请空间失败!\n");
return ;
}
p->data=str[j];
p->lchild=NULL;
p->rchild=NULL;
if(!root)
{
root=p;
}
else
{
if(flg==1)
st[top]->lchild=p;
if(flg==2)
st[top]->rchild=p;
}
}
j++;
}

return ;
}

int SumLeaf(BTNode *root)
{
int flg=0;
int count1=0,count2=0,count_sum=0;

BTNode* queue[MAX];
BTNode* p=NULL;
int rear=-1,front=-1;

if(!root)
return -1;
rear++;
queue[rear]=root;
while(rear!=front)
{

front++;
p=queue[front];
//计算总结点数
count_sum++;
flg=0;
if(p->lchild)
{
//进队
rear++;
queue[rear]=p->lchild;
flg++;
}
if(p->rchild)
{
rear++;
queue[rear]=p->rchild;
flg++;
}
if(1==flg)
{
count1++;

}
if(2==flg)
{
count2++;
}
}
//总结点-结点数为1的-结点数为2的
return (count_sum-count2-count1);
}

void main()
{
int i;
BTNode *ROOT=NULL;
CreatBT(ROOT,"A(B(D(,G)),C(E,F))");
i=SumLeaf(ROOT);
printf("一共有%d个度为0的结点\n",i);
//高度为4的满二叉树 1+2+4=7
CreatBT(ROOT,"A(B(D(H,I),E(J,K)),C(F(L,M),G(N,O)))");
i=SumLeaf(ROOT);
printf("一共有%d个度为0的结点\n",i);
return ;
}




比上面简单的算法:

#include<stdio.h>
#include<malloc.h>
//2013-12-24
//乾卦
#define MAX 256
typedef struct Node
{
char data;
struct Node *rchild;
struct Node *lchild;
}BTNode;
//创建二叉树
void CreatBT(BTNode *&root,char *str)
{
int top=0;
int j=0;
BTNode *st[MAX];
BTNode *p=NULL;
int flg=0;
root=NULL;
while(str[j]!='\0')
{
if(str[j]=='(')
{
top++;
st[top]=p;
flg=1;
}
else if(str[j]==')')
{
top--;
}
else if(str[j]==',')
{
flg=2;
}
else
{
p=(BTNode*)malloc(sizeof(BTNode));
if(!p)
{
printf("申请空间失败!\n");
return ;
}
p->data=str[j];
p->lchild=NULL;
p->rchild=NULL;
if(!root)
{
root=p;
}
else
{
if(flg==1)
st[top]->lchild=p;
if(flg==2)
st[top]->rchild=p;
}
}
j++;
}

return ;
}
//求二叉树有多少个度为0的结点
int _SumLeaf(BTNode *root)
{
int flg=0;
int count=0;
BTNode* queue[MAX];
BTNode* p=NULL;
int rear=-1,front=-1;

if(!root)
return -1;
rear++;
queue[rear]=root;
while(rear!=front)
{
front++;
p=queue[front];
flg=0;
if(p->lchild)
{
//进队
rear++;
queue[rear]=p->lchild;
flg++;
}
if(p->rchild)
{
rear++;
queue[rear]=p->rchild;
flg++;
}
if(0==flg)
count++;
}

return count;
}

void main()
{
int i;
BTNode *ROOT=NULL;
CreatBT(ROOT,"A(B(D(,G)),C(E,F))");
i=_SumLeaf(ROOT);
printf("一共有%d个度为0的结点\n",i);
//高度为4的满二叉树
CreatBT(ROOT,"A(B(D(H,I),E(J,K)),C(F(L,M),G(N,O)))");
i=_SumLeaf(ROOT);
printf("一共有%d个度为0的结点\n",i);
return ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: