类C语言---树习题:用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。

此代码可以正常运行,下附有运行区
[题目分析]
若某个结点左子树空右子树非空或者右子树空左子树非空,则该结点为度为1的结点

#include 
#include 
#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);

}

类C语言---树习题:用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。_第1张图片

你可能感兴趣的:(树,二叉树,队列,指针,算法)