【数据结构】层序生成二叉树

这篇博客介绍了如何使用层序遍历的方法构建二叉树。在构建过程中,通过队列存储节点,依次处理各层节点并创建左右子节点。文章提供了具体的步骤解释和示例,以及对应的代码实现。

层序创建二叉树所用的输入序列是按树的从上到下从左到右的顺序形成的,各层的空节点输入数值0。在构造二叉树的过程中,需要一个队列暂时存储各节点,其创建过程如下。

  1. 输入第一个数据:
    • 若为0,表示此树为空,将空指针赋给根指针,树构造完毕。
    • 若不为0,动态分配一个节点单元,并存入数据,同时将该节点放入队列。
  2. 若队列不为空,从队列拿出一个节点,并建立该节点的左右孩子:
    • 从输入序列读入下一数据:
      若读入数据为0,将出队节点的做孩子指针置空;否则,分配一个节点单元,存入所读数值,将其置为出队节点的左孩子,同时将该孩子节点入队。
    • 再从输入序列读入下一个数据:
      若读入数据为0,将出队节点的做孩子指针置空;否则,分配一个节点单元,存入所读数值,将其置为出队节点的右孩子,同时将该孩子节点入队。
  3. 重复第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
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值