设二叉树的前序序列是ABDEGHCFIJ 中序序列为DBGEHACIFJ 求后序序列?

如题所述

二叉树的前序序列是ABDEGHCFIJ  中序序列为DBGEHACIFJ

根据前序序列ABDEGHCFIJ, 可以确定A是根结点.

中序序列DBGEH A CIFJ里以A为中心, DBGEH是A的左子树, CIFJ是A的右子树.

          A
         / \
    DBGEH   CIFJ

前序序列ABDEGHCFIJ里B紧跟A之后, B是A的左孩子.
中序序列DBGEHACIFJ里D排在最前, D之后是B, 预计D没有左子树,也没有右子树,
并且D是B的左孩子.

          A
         / \
        B   CIFJ
       / \
      D   GEH

前序序列ABDEGHCFIJ里E跟在B后面, 预计E是B的右孩子.
中序序列DBGEHACIFJ里E的左边是G, 而右边是H, 预计E的左孩子是G, 右孩子是H,
再次观察前序序列ABDEGHCFIJ里的EGH这种顺序可以确定,E的左右孩子就是G和H.

          A
         / \
        B   CIFJ
       / \
      D   E
         / \
        G   H

前序序列ABDEGHCFIJ里的CFIJ, C排在最前,
中序序列DBGEHACIFJ里的C在A的后面, 可以确定C是A的右孩子.

          A
         / \
        B   C
       / \   \
      D   E   IFJ
         / \
        G   H

前序序列ABDEGHCFIJ里F跟在C的后面, F会是C的左孩子或者右孩子,
而F后面跟着的是IJ, 预计I和J属于F的子树.
中序序列DBGEHACIFJ里C之后是F, 而F的左边是I, 右边是J, I跟在C的后面,
可以确定F是C的右孩子, I和J是F的左右孩子.

二叉树示意图:
           A
         /    \
        B      C
       / \      \
      D   E      F
         / \    / \
        G   H  I   J

后序序列是 D G H E B I J F C A


C语言测试程序
测试结果:

创建二叉树,输入前序扩展序列: ABD##EG##H##C#FI##J##
前序遍历序列: A B D E G H C F I J
中序遍历序列: D B G E H A C I F J
后序遍历序列: D G H E B I J F C A


#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
    char data;
    struct Node *lchild;
    struct Node *rchild;
}Bitree;
//用"前序遍历"算法创建二叉树
void CreateBiTree(Bitree **bt)
{
    char s;
    scanf("%c",&s); //输入数据
    if(s=='#')      //'#'是空节点
        *bt=NULL;
    else
    {
        *bt=(Bitree *)malloc(sizeof(Bitree));
        (*bt)->data=s;
        CreateBiTree(&((*bt)->lchild));
        CreateBiTree(&((*bt)->rchild));
    }
}
//前序遍历
void preOrder(Bitree *ptr)
{
    if(ptr!=NULL)
    {
        printf("%c ",ptr->data);
        preOrder(ptr->lchild);
        preOrder(ptr->rchild);
    }
}
//中序遍历
void inOrder(Bitree *ptr)
{
    if(ptr!=NULL)
    {
        inOrder(ptr->lchild);
        printf("%c ",ptr->data);
        inOrder(ptr->rchild);
    }
}
//后序遍历
void postOrder(Bitree *ptr)
{
    if(ptr!=NULL)
    {
        postOrder(ptr->lchild);
        postOrder(ptr->rchild);
        printf("%c ",ptr->data);
    }
}

int main()
{
    Bitree *root;
    printf("创建二叉树,输入前序扩展序列: ");
    CreateBiTree(&root);

    printf("前序遍历序列: ");
    preOrder(root);
    printf("\n中序遍历序列: ");
    inOrder(root);
    printf("\n后序遍历序列: ");
    postOrder(root);

    printf("\n");
    return 0;
}

追问

前序CFIJ,中序CIFJ,

不是说对于右子树也要用相同的序列方式操作吗?

遍历第一个右边的时候,

前序是根,左,右

中序是左右根

怎么确定C就是下一个结点啊?

我在这里搞不懂,左边的都读的来

不知道哪里出问题了

求求大神叫叫鄙人

教教

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-06-29
中序是左根右,后序才是左右跟。