用c语言实现以二叉链表作为二叉树的存储结构,编写用层次顺序遍历二叉树的方法,统计树中度为1 的结点个数。
时间: 2024-05-11 10:19:44 浏览: 100
这里给出以二叉链表作为二叉树的存储结构的定义:
```c
typedef struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
```
其中`data`为结点数据,`lchild`为左子树指针,`rchild`为右子树指针。
下面是用层次顺序遍历二叉树的方法的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef struct{
BiTree data[MAXSIZE];
int front, rear;
}Queue;
// 初始化队列
void InitQueue(Queue *Q){
Q->front = Q->rear = 0;
}
// 判断队列是否为空
int QueueEmpty(Queue Q){
return (Q.front == Q.rear);
}
// 入队
int EnQueue(Queue *Q, BiTree t){
if((Q->rear + 1) % MAXSIZE == Q->front){
return 0; // 队列已满
}
Q->data[Q->rear] = t;
Q->rear = (Q->rear + 1) % MAXSIZE;
return 1;
}
// 出队
int DeQueue(Queue *Q, BiTree *t){
if(Q->front == Q->rear){
return 0; // 队列已空
}
*t = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return 1;
}
// 层次顺序遍历二叉树
void LevelOrder(BiTree T){
if(T == NULL){
return;
}
Queue Q;
InitQueue(&Q);
EnQueue(&Q, T);
BiTree p;
while(!QueueEmpty(Q)){
DeQueue(&Q, &p);
printf("%c ", p->data);
if(p->lchild != NULL){
EnQueue(&Q, p->lchild);
}
if(p->rchild != NULL){
EnQueue(&Q, p->rchild);
}
}
}
// 统计树中度为1的结点个数
int CountDegree1(BiTree T){
if(T == NULL){
return 0;
}
if(T->lchild == NULL && T->rchild != NULL){
return 1 + CountDegree1(T->rchild);
}
if(T->lchild != NULL && T->rchild == NULL){
return 1 + CountDegree1(T->lchild);
}
return CountDegree1(T->lchild) + CountDegree1(T->rchild);
}
int main(){
// 构造一棵二叉树
BiTree T = (BiTree)malloc(sizeof(BiTNode));
T->data = 'A';
T->lchild = (BiTree)malloc(sizeof(BiTNode));
T->lchild->data = 'B';
T->rchild = (BiTree)malloc(sizeof(BiTNode));
T->rchild->data = 'C';
T->lchild->lchild = (BiTree)malloc(sizeof(BiTNode));
T->lchild->lchild->data = 'D';
T->lchild->rchild = NULL;
T->rchild->lchild = (BiTree)malloc(sizeof(BiTNode));
T->rchild->lchild->data = 'E';
T->rchild->rchild = NULL;
T->lchild->lchild->lchild = NULL;
T->lchild->lchild->rchild = NULL;
T->rchild->lchild->lchild = NULL;
T->rchild->lchild->rchild = NULL;
printf("层次遍历二叉树: ");
LevelOrder(T);
printf("\n");
printf("度为1的结点个数为: %d\n", CountDegree1(T));
return 0;
}
```
这里的`CountDegree1`函数统计树中度为1的结点个数。如果当前结点的左子树为空而右子树不为空,或者左子树不为空而右子树为空,那么当前结点就是度为1的结点,返回1加上递归计算左子树和右子树的度为1的结点个数之和。如果当前结点的左子树和右子树都为空,那么返回0。否则,递归计算左子树和右子树的度为1的结点个数之和。
阅读全文