P1030 [NOIP2001 普及组] 求先序排列

文章讲述了如何通过找出中序遍历中的根节点位置,利用递归方法解决先序排列的字符串树结构问题,包括确定根节点、划分左右子树和遵循先根左右顺序输出的过程。
摘要由CSDN通过智能技术生成

解题思路:

1.首先我们要找出根节点root,很显然它一定在后续遍历的最后一位,通过用size()来计算后续字符串的长度,然后结合数组输出后序遍历的根节点root;

2.再使用find()函数结合后续遍历的长度找到根节点在中序遍历中的位置,根据根节点的位置,我们可以在中序遍历中分离出左子树和右子树。

3.前序遍历的顺序是:根,左,右;我们只需重复递归操作,先对左子树进行递归,每次都输出该子树的根节点,直到子树长度为0,退出递归。然后右子树重复以上操作。

4.解题的关键:

一、找出根节点在中序遍历中的位置;

二、退出条件(子树长度为0);

三、按照 根、左、右的顺序输出;

四、每次输出只输出该数的根节点。

------------------------------------------------------------------------

上面我已经分析的比较透彻了,具体操作我就不做注释了。

P1030[NOIP2001 普及组] 求先序排列
#include<iostream>
using namespace std;
void dfs(string inor, string after) {
    if (inor.size()==0)
        return;
    int len = after.size()-1;
    //string root = after.substr(len);//这两操作效果一样的;(任选其一)
    char root = after[len];//这两操作效果一样的
    int k = inor.find(root);
    cout << root;
    dfs(inor.substr(0, k), after.substr(0,k));
    dfs(inor.substr(k+1), after.substr(k,after.size()-1-k));
}
int main() {
    string s1, s2;
    cin >> s1 >> s2;
    dfs(s1, s2);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值