永发信息网

已知一棵二叉树的层次遍历序列ABCDEFG,中序遍历为BAFGDCE,则这个二叉树怎么画?

答案:1  悬赏:70  手机版
解决时间 2021-04-27 03:43
已知一棵二叉树的层次遍历序列ABCDEFG,中序遍历为BAFGDCE,则这个二叉树怎么画?
最佳答案
根据 层次遍历序列ABCDEFG, 中序遍历序列BAFGDCE, 得到的二叉树是:

     A
   /  
  B    C
      / 
     D   E
    /
   F
    
     G

先序遍历序列: ABCDFGE
中序遍历序列: BAFGDCE
后序遍历序列: BGFDECA
层次遍历序列: ABCDEFG


如果是如下形状的二叉树,则
层次遍历序列仍然是ABCDEFG,但是,中序遍历序列是BAFDGCE (D,F,G的结构不同了)
     A
   /  
  B    C
      / 
     D   E
    / 
   F   G


// C代码测试程序
// 输入先序扩展序列: AB##CDF#G###E##
// 输出4种遍历结果
// 先序遍历序列: ABCDFGE
// 中序遍历序列: BAFGDCE
// 后序遍历序列: BGFDECA
// 层次遍历序列: ABCDEFG
//
// 二叉树示意图:
//     A
//   /  
//  B    C
//      / 
//     D   E
//    /
//   F
//    
//     G
//
#include 
#include 
#define OK 1
#define OVERFLOW -2
typedef int Status;
typedef char TElemType;
typedef int bool;

typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild;
    struct BiTNode *rchild;
}BiTNode, *BiTree;

typedef BiTNode * QElemType;

typedef struct QNode
{
    QElemType data;
    struct QNode * next;
}QNode, *QueuePtr;

typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;

Status InitQueue_L(LinkQueue *Q)
{
    (*Q).front = (QueuePtr) malloc (sizeof(QNode));
    if ((*Q).front == NULL)
        return OVERFLOW;
    (*Q).front->next = NULL;
    (*Q).rear = (*Q).front;
    return OK;
}

bool QueueEmpty_L(LinkQueue Q)
{
    return (Q.front == Q.rear);
}

Status EnQueue_L(LinkQueue *Q, QElemType e)
{
    QNode *s = (QNode *) malloc (sizeof(QNode));
    s->data = e;
    s->next = NULL;
    (*Q).rear->next = s;
    (*Q).rear = s;
    return OK;
}

Status DeQueue_L(LinkQueue *Q)
{
    QNode *q = (*Q).front->next;
    (*Q).front->next = q->next;
    if (q->next == NULL)
        (*Q).rear = (*Q).front;
    free(q);
    return OK;
}

//创建二叉树: 先序扩展序列 + 递归法
void CreateBiTree(BiTree *T)
{
    char input;
    scanf("%c",&input); //输入数据
    if(input == '#')    //'#'是空节点
    {
       *T = NULL;
    }
    else
    {
        *T=(BiTree)malloc(sizeof(BiTNode));
        if(*T == NULL)
        {
            printf("
分配动态内存时出错.
");
            exit(1);
        }
        (*T)->data=input;
        CreateBiTree(&((*T)->lchild));
        CreateBiTree(&((*T)->rchild));
    }
}

void PreOrder(BiTree T) //先序遍历
{
    if(T != NULL)
    {
        printf("%c",T->data);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}
void InOrder(BiTree T) //中序遍历
{
    if(T != NULL)
    {
        InOrder(T->lchild);
        printf("%c",T->data);
        InOrder(T->rchild);
    }
}

void PostOrder(BiTree T) //后序遍历
{
    if(T != NULL)
    {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c",T->data);
    }
}

void LevelOrder(BiTree T) //层序遍历
{
    LinkQueue Q;
    BiTree p = T;
    if(p == NULL)
    {
        return;
    }
    InitQueue_L(&Q);
    EnQueue_L(&Q, p);
    while( !QueueEmpty_L(Q) )
    {
        p = Q.front->next->data;
        DeQueue_L(&Q);
        printf("%c",p->data);
        if(p->lchild != NULL)
        {
            EnQueue_L(&Q, p->lchild);
        }
        if(p->rchild != NULL)
        {
            EnQueue_L(&Q, p->rchild);
        }
    }
}

int main()
{
    BiTree T;
    CreateBiTree(&T);
    printf("先序遍历序列: ");
    PreOrder(T);
    printf("
");
    printf("中序遍历序列: ");
    InOrder(T);
    printf("
");
    printf("后序遍历序列: ");
    PostOrder(T);
    printf("
");
    printf("层次遍历序列: ");
    LevelOrder(T);
    printf("
");
    return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
1993年1月28日出生。姓名李易娇。请问专家她
为什么会有代码错误?
DNF中气功师的觉醒有快捷键吗?
深圳市的原始分400换算标准多少?
在哪里可以下载《the L word》
谁知道空间flash游戏模块的网址
沥北警务区我想知道这个在什么地方
急求山东人民出版社《品德与社会》六年级下册
誓言是真的 离开也是真的 心也是真的 唯一假
没有勇气做某事的时候该怎么办????
牙齿碰一碰就很酸、酸的都不能咬东西了,是怎
12月25日是什么座的
请教场效应管KHB9D5N20F的代换
恋姬无双有多少集?
【ぷ❤ニレヘ❤ル】这是那3个字?
推荐资讯
新潮时装商店在哪里啊,我有事要去这个地方
酉鸡年是什么意思
孙楠的新专辑在哪能买到?
考试四级怎么才有把握?
QQ宠物出了补习班吗
写美丽风景的诗句,两句描写优美景色的诗句
谁可以帮我设计一下这个名字啊 “杨磊”
刑法对预备犯、未遂犯、中止犯的处罚原则有什
怎么样,才能遗忘曾经的美?
一句话 帮我看看什么意思
仙剑奇侠传3一共多少级?
人长的漂不漂亮是拿什么来衡量
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?