此代码可以正常运行,下附有运行区
[题目分析]
若某个结点左子树空右子树非空或者右子树空左子树非空,则该结点为度为1的结点
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
//定义结点
typedef struct BiTNode
{
char data; //数据
struct BiTNode *lchild; //左孩子
struct BiTNode *rchild; //右孩子
}BiTNode, *BiTree;
typedef struct BiTNode * ElemType;
typedef struct QNode
{
ElemType data[MAX];
int front,rear;
}SeQueue;
//先序创建二叉树
BiTree CreateBiTree()
{
char ch;
BiTree T;
scanf("%c", &ch);
if (ch == '#')
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;
}
void QueueInit(SeQueue &Q)
{
Q.front = Q.rear = 0;//队头和队尾相等即为空队列
}
void QueueIn(SeQueue &Q,BiTree x)
{
if( (Q.rear+1) % MAX == Q.front )//入队必须判断队列是否满了
printf("Queue full\n");
Q.rear = (Q.rear+1) % MAX;
Q.data[Q.rear] = x;
}
BiTree QueueOut(SeQueue &Q)
{
if(Q.rear == Q.front) //出队列时候必须判断队列是否为空
printf("Queue empty\n");
BiTree x;
Q.front = (Q.front+1) % MAX;
x = Q.data[Q.front];
return x;
}
int QueueEmpty(SeQueue Q)
{
return (Q.front==Q.rear);
}
int Level(BiTree bt) //层次遍历二叉树,并统计度为1的结点的个数
{
BiTree p;
SeQueue Q;
int num=0; //num统计度为1的结点的个数
if(bt)
{
QueueInit(Q);
QueueIn(Q,bt);//Q是以二叉树结点指针为元素的队列
while(!QueueEmpty(Q))
{
p=QueueOut(Q);
printf("%c ",p->data); //出队,访问结点
if(p->lchild && !p->rchild ||!p->lchild && p->rchild)
num++;//度为1的结点
if(p->lchild) QueueIn(Q,p->lchild); //非空左子女入队
if(p->rchild) QueueIn(Q,p->rchild); //非空右子女入队
} // while(!QueueEmpty(Q))
}//if(bt)
return(num);
}//返回度为1的结点的个数
int main()
{
BiTree T;
printf("先序创建二叉树,以#虚设结点\n");
T=CreateBiTree();
printf("\n");
int num=Level(T);
printf("层次遍历后,度为1的节点个数为:%d\n",num);
}

本文介绍了一种利用层次遍历方法来统计二叉树中度为1的节点数目的算法。通过分析,当结点的左子树为空而右子树非空,或者右子树为空而左子树非空时,该结点被视为度为1的节点。提供的代码能够正确实现这一功能。
1680

被折叠的 条评论
为什么被折叠?



