层序创建二叉树所用的输入序列是按树的从上到下从左到右的顺序形成的,各层的空节点输入数值0。在构造二叉树的过程中,需要一个队列暂时存储各节点,其创建过程如下。
- 输入第一个数据:
- 若为0,表示此树为空,将空指针赋给根指针,树构造完毕。
- 若不为0,动态分配一个节点单元,并存入数据,同时将该节点放入队列。
- 若队列不为空,从队列拿出一个节点,并建立该节点的左右孩子:
- 从输入序列读入下一数据:
若读入数据为0,将出队节点的做孩子指针置空;否则,分配一个节点单元,存入所读数值,将其置为出队节点的左孩子,同时将该孩子节点入队。 - 再从输入序列读入下一个数据:
若读入数据为0,将出队节点的做孩子指针置空;否则,分配一个节点单元,存入所读数值,将其置为出队节点的右孩子,同时将该孩子节点入队。
- 从输入序列读入下一数据:
- 重复第2步过程,直到队列为空,再无节点出队,构造过程结束。
示例
构造如图所示二叉树所需的输入序列:
1 2 3 4 5 6 7 0 8 0 0 9 10 0 0 0 0 0 0 0 0
代码如下
#include <stdio.h>
#include "queue.h"
typedef struct TreeNode * BinTree;
BinTree CreataBinTree()
{
int Date;
Queue Queue, *Q;
Q = &Queue;
Q->front = Q->rear = 0;
BinTree T,BT;
scanf("%d", &Date);
if(Date){
BT = (BinTree)malloc(sizeof(BinTree));
BT->Date = Date;
AddQ(Q,BT);
}
else
return NULL;
while(!IsEmptyQ(Q)){
T = DeleteQ(Q);
scanf("%d", &Date);
if(!Date)
T->Left = NULL;
else{
T->Left = (BinTree)malloc(sizeof(BinTree));
T->Left->Date = Date;
AddQ(Q,T->Left);
}
scanf("%d", &Date);
if(!Date)
T->Right = NULL;
else{
T->Right = (BinTree)malloc(sizeof(BinTree));
T->Right->Date = Date;
AddQ(Q,T->Right);
}
}
return BT;
}
上述代码包含的头文件”queue.h”中有队列的相关函数,其代码如下
#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED
#define MaxSize 100
typedef struct TreeNode * BinTree;
struct TreeNode{
int Date;
struct TreeNode *Left;
struct TreeNode *Right;
};
typedef struct{
BinTree Date[MaxSize];
int front;
int rear;
} Queue;
int IsEmptyQ(Queue * Q)
{
if(Q->front==Q->rear)
return 1;
else
return 0;
}
void AddQ(Queue *Q, BinTree item)
{
if((Q->rear+1)%MaxSize == Q->front){
printf("队已满\n");
return;
}
else{
Q->rear = (Q->rear+1)%MaxSize;
Q->Date[Q->rear] = item;
}
}
BinTree DeleteQ(Queue *Q)
{
if(Q->rear == Q->front){
printf("队已空\n");
return NULL;
}
else{
Q->front = (Q->front+1)%MaxSize;
return Q->Date[Q->front];
}
}
#endif // QUEUE_H_INCLUDED
这篇博客介绍了如何使用层序遍历的方法构建二叉树。在构建过程中,通过队列存储节点,依次处理各层节点并创建左右子节点。文章提供了具体的步骤解释和示例,以及对应的代码实现。
8483

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



