980: 输出利用先序遍历创建的二叉树的层次遍历序列

本文介绍如何使用先序递归算法创建二叉树,并通过层次遍历方式输出其节点序列。通过实例演示了如何处理输入字符序列中的'#'和非'#'字符,以确定树形结构。

题目描述
利用先序递归遍历算法创建二叉树并输出该二叉树的层次遍历序列。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#“时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树的层次遍历序列。需要注意输入数据序列中的”#“字符和非”#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。

输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。

输出
每个用例用一行出该用例对应的二叉树的层次遍历序列。

样例输入

A##
ABC####
AB##C##
ABCD###EF##G##H##
A##B##

样例输出

A
ABC
ABC
ABHCEDFG
A
#include<stdio.h>
#include<malloc.h>
#define MaxSize 1000
typedef struct node//二叉树结点
{
    char data;
    struct node *lchild;
    struct node *rchild;
}BTnode;
typedef struct//环形队列
{
    BTnode *data[MaxSize];
    //数组存放二叉树结点
    int Front,Rear;
}SqQueue;
void init(SqQueue*&q)//见书101页
{
    q=(SqQueue*)malloc(sizeof(SqQueue));
    q->Front=q->Rear=0;
}
void enQueue(SqQueue*&q,BTnode* e)
{
    if((q->Rear+1)%MaxSize==q->Front) return ;
    //如果队列满了,则放弃本次入队操作
    q->Rear=(q->Rear+1)%MaxSize;
    q->data[q->Rear]=e;
}
void deQueue(SqQueue*&q,BTnode*&p)
{
    if(q->Rear==q->Front) return ;
    //如果队列为空,则放弃本次出队操作
    q->Front=(q->Front+1)%MaxSize;
    //Front指向队列首元素之前的位置,加一后为正确位置
    p=q->data[q->Front];
    //出队,数据存在p中,p是引用类型
}
bool QueueEmpty(SqQueue*qu)
{
    return (qu->Rear==qu->Front);
}
BTnode*Create()//创建二叉树
{
    BTnode *Node;
    Node=(BTnode*)malloc(sizeof(BTnode));
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
    {
        Node=NULL;
    }else
    {
        Node->data=ch;
        Node->lchild=Create();
        Node->rchild=Create();
    }
    return Node;
}
void LayerOrder(BTnode*root)//层序遍历
{
    BTnode*p;//临时二叉树结点
    SqQueue*qu;//循环队列
    init(qu);//初始化循环队列
    enQueue(qu,root);//将根节点入队
    while(!QueueEmpty(qu))
    {
        deQueue(qu,p);//出队一个元素
        printf("%c",p->data);
        if(p->lchild!=NULL)
        //左子树非空,入队左子树
        enQueue(qu,p->lchild);
        if(p->rchild!=NULL)
        //右子树非空,入队右子树
        enQueue(qu,p->rchild);
    }
}
int main()
{
    node *root;
    root=Create();
    //Create返回的根节点记为root
    LayerOrder(root);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值