已知先序遍历序列和中序遍历序列,求后序遍历序列

本文详细介绍了如何从已知的二叉树先序和中序遍历序列中求解后序遍历序列,通过实例讲解了寻找根节点、划分左右子树的过程,并提供了实现代码。

回顾一下二叉树的三种遍历

先序: 根->左->右

中序:左->根->右

后序:左->右->根

只要我们知道中序和先序或着后序 那么我们就可以根据已知的两种遍历序列
求出剩下的另一种遍历序列

例:已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,中序遍历序列为:D-B-G-E-A-C-F。求该二叉树后序遍历序列

第一步:找根 先序遍历先遍历根结点 那么它的序列第一个肯定是根节点也就是上面的A

第二步:找根结点的左右子数 中序遍历先左后根后右 在中序序列中找到根结点的位置那么它的左边就是它的左子树序列 右边就是它的右子数序列
即上面的 D-B-G-E 和 C-F

第三步:拆分转化为子问题 去掉A结点 将树分为两个二叉树 B-D-E-G 和C-F
然后按照第一步分别找两颗树的根 B C 然后根据第二部找根的左右子数
B(左边D 右边 G-E) C (左边NULL 右边 F) 一次类推 直到还原出二叉树的模型

这里写图片描述

最后我们就可以根据后续遍历规则得出该二叉树的后续遍历序列为:D-G-E-B-F-C-A。

struct Node
{
    char data;
    Node *left;
    Node *right;
};

Node *getBinaryTree(char *preOrder, char *inOrder, int len)
{
    if (preOrder == NULL || *preOrder == '\0' || len <= 0)
        return NULL;

    Node *root = new Node;
    root->data = *preOrder; // 前序遍历的第一个节点就是根节点

    // 找到根节点在中序遍历中的位置,其值也代表了左子树的节点数目
    int pos = 0;
    while (1)
    {
        if (*(inOrder + pos) == root->data)
        {
            break;
        }
        pos++;
    }

    // 递归找到左子树和右子树
    if (0 == pos)
    {
        root->left = NULL;
    }
    else
    {
        root->left = getBinaryTree(preOrder + 1, inOrder, pos);
    }

    if (0 == len - pos - 1)
    {
        root->right = NULL;
    }
    else
    {
        root->right = getBinaryTree(preOrder + pos + 1, inOrder + pos + 1, len - pos - 1);
    }

    return root;
}

void postOrder(Node *root)
{
    if (root == NULL)
        return;

    postOrder(root->left);
    postOrder(root->right);
    cout << root->data;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值