后序+中序序列构造二叉树

后序+中序序列构造二叉树

输入样例:

第一行输入序列长度n,第二行输入n个字符表示二叉树后序遍历的序列,第三行输入n个字符表示二叉树中序遍历的序列

9
GHDBEIFCA
GDHBAECIF

输出样例:

输出二叉树先序遍历的序列。

ABDGHCEFI

源代码

#include <bits/stdc++.h>
using namespace std;

int nodeNum;
string hou, zhong;

typedef struct treeNode
{
    char data;
    treeNode *left;
    treeNode *right;
} TreeNode;

void printTest(TreeNode *treeRoot, int zhongLeft, int zhongRight, int houLeft, int houRight, int pos, int leftLen)
{
    cout << "*************************************" << endl;
    cout << "treeRoot.data = " << treeRoot->data << endl;
    cout << "leftTree : " << endl;
    cout << "   zhong : ";
    for (int i = zhongLeft; i <= pos - 1; ++i)
    {
        cout << zhong[i];
    }
    cout << endl;
    cout << "   hou : ";
    for (int i = houLeft; i <= houLeft + leftLen; ++i)
    {
        cout << hou[i];
    }
    cout << endl;
    cout << "rightTree : " << endl;
    cout << "   zhong : ";
    for (int i = pos + 1; i <= zhongRight; ++i)
    {
        cout << zhong[i];
    }
    cout << endl;
    cout << "   hou : ";
    for (int i = houLeft + leftLen + 1; i <= houRight - 1; ++i)
    {
        cout << hou[i];
    }
    cout << endl;
    cout << "*************************************" << endl;
}

treeNode *build(int zhongLeft, int zhongRight, int houLeft, int houRight)
{

    if (zhongLeft > zhongRight || houLeft > houRight)
    {
        // cout << t++ << endl;
        return nullptr;
    }
    else
    {
        TreeNode *treeRoot = new TreeNode();
        treeRoot->data = hou[houRight];
        int pos = zhong.find(hou[houRight]);
        int leftLen = pos - 1 - zhongLeft;

        printTest(treeRoot, zhongLeft, zhongRight, houLeft, houRight, pos, leftLen);

        treeRoot->left = build(zhongLeft, pos - 1, houLeft, houLeft + leftLen);
        treeRoot->right = build(pos + 1, zhongRight, houLeft + leftLen + 1, houRight - 1);
        return treeRoot;
    }
}

void xianRead(TreeNode *tree)
{
    if (tree)
    {
        cout << tree->data;
        xianRead(tree->left);
        xianRead(tree->right);
    }
}

int main()
{
    // cout << "begin" << endl;
    cin >> nodeNum;

    cin >> hou >> zhong;

    // cout << "nodeNum = " << nodeNum << endl;
    // cout << "hou = " << hou << endl;
    // cout << "zhong = " << zhong << endl;

    TreeNode *tree = build(0, zhong.size() - 1, 0, hou.size() - 1);

    xianRead(tree);

    return 0;
}

总结

瞎说

当时学数据结构的时候就经常被强调一句话,树的相关问题用递归。

现在学习算法,明白了递归总是和分治结合在一起,因而对于树的相关问题用递归这句胡好像理解的更多了一点。

树的结构就仿佛是为递归设计的,递归用于解决分治问题,分治问题就是问题的结构一样,不一样的是问题的规模。即,一个问题,当这个问题的规模小的时候,我们会解决,但是当这个问题规模大了之后,就不好解决了。但是这个问题如果可以拆解成多个比该问题规模要小的同结构的子问题,那么这个问题就可以用分治的方法去解决了。树就是这样,一颗大树有两颗小子树构成,而且每个小子树单独看也都是一颗树,所以树的问题用递归分治来解就会舒服一点。

回到本题

1、大体思路是根据中序遍历和后序遍历结果,生成树结构,然后对这棵树进行先序遍历,从而打印结果。(冥冥中总觉得可以不生成树结构,直接根据后序遍历和中序遍历的结果打印出先序遍历的结果,但是目前没往那个方面想)。

2、设想,当n==1时:即这颗树只有一个根结点,然后题目再给出这棵树的后序遍历和中序遍历的结果,你会把这棵树构造出来吗?答案是肯定的,你的工作就是申请一块内存用来表示根结点,把这唯一的结点数据存进去,然后就解决问题了。

3、 往大了推,当n==3时:这题首先咱先摆明了,我想用分治法解。那现在问题就是,我如何把这个n==3的问题化解成若干个n==1的问题。首先根结点贼好确定,后序遍历的最后一个字符,就是根结点。除去这个之外,我们只要能找到这个树的左子树的后序遍历和中序遍历序列就行了。巴拉巴啦找规律。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗马尼亚硬拉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值