根据前序遍历、中序遍历构建二叉树,并后序遍历输出。

前序遍历:abdeijcfg

中序遍历:dbiejafcg

后序遍历:dijebfgca //期望结果


解法:先序中的首元素a 必为该二叉树的根结点,在中序序列里a之前的元素一定是a的左子树部分,a之后的元素一定为a的右子树部分。

所以,可以看作

先序: root | 左子树 | 右子树

中序: 左子树 | root | 右子树

由此, 我们可以递归的得到该二叉树。 即,先得到root根结点,然后,对左、右子树进行同样的操作。

所以建立二叉树的过程可看作:

                                                MakeBinaryTree(...)
                                                {
                                                        得到root 根结点;

                                                        MakeBinaryTree( 左子树 );
                                                        MakeBinaryTree( 右子树 );
                                                }

题外话:
如果已知中序,后序遍历结果,求先序。由于后序可看作 左子树 | 右子树 | 根,可以考虑从后向前操作,这样可以先确定根。

#include <stdio.h>

typedef struct node
{
    char data;
    struct node *lchild;
    struct node *rchild;
}BTNode;

BTNode* CreateBinaryTree(const char *pre,const char *mid,int len)
{
    if(len == 0)
    {
        return NULL;
    }

    BTNode *root = (BTNode *)malloc(sizeof(BTNode));
    root->data = *pre;

    char *rootPlace = strchr(mid,*pre);

    int leftLen = strlen(mid) - strlen(rootPlace);
    int rightLen = len - leftLen - 1;

    root->lchild = CreateBinaryTree(pre+1,mid,leftLen);
    root->rchild = CreateBinaryTree(pre+leftLen+1,rootPlace+1,rightLen);

    return root;
}

void PostTraversal(BTNode *root)
{
    if(root != NULL)
    {
        PostTraversal(root->lchild);
        PostTraversal(root->rchild);
        printf("%c",root->data);
    }
}

int main()
{
    char *pre = "abdeijcfg";
    char *mid = "dbiejafcg";

    int len = strlen(pre);

    BTNode *root = CreateBinaryTree(pre,mid,len);

    PostTraversal(root); //dijebfgca

    printf("\n");

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值