uva 563 Tree Recovery

本文介绍了一种算法,该算法接收二叉树的先序和中序遍历序列作为输入,并输出对应的后序遍历序列。通过递归地划分二叉树的左子树和右子树来实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入一颗二叉树的先序遍历和中序遍历,输出后序遍历序列;
样例输入输出:
DBACEGF ABCDEFG —> ACBFGED
BCAD CBAD —> CDAB

// 先序 = root + 左子序 + 右子序
中序 = 左子序 + root + 右子序
后序 = 左子序 + 右 子序 + root

#include "iostream"
#include "string"
#include "cstdio"
#include "cstring"
#include "cmath"
#include "map"
#include "stack"
#include "algorithm"
using namespace std;

string recovery(string s1,string s2) { //s1是先序,s2是中序,返回后序
    if(s1.size() == 0) return "";   //结束条件写在前面
    if(s1.size() == 1) return s1;

    char root = s1[0];  // 根节点是先序的第一个节点
    string l1,l2,r1,r2;
    int len,k;
    len = s2.size(); //先序与后序的总长度都是len
    for(int i = 0; i < len; i++) {
        if(s2[i] == root) {  //找到root节点在中序中的位置,用k保存
            k = i;
            break;
        }
    }

    for(int i = 1; i <= k; i++) l1 = l1+s1[i];    //左子序的先序
    for(int i = k+1; i < len; i++) r1 = r1 + s1[i]; //   右子序的先序
    for(int i = 0; i <= k-1; i++) l2 = l2 + s2[i];  // 左子序的中序
    for(int i = k+1; i < len; i++) r2 = r2 + s2[i];   //右子序的中序

    return recovery(l1,l2) + recovery(r1,r2) + root;  //递归求后序,后序 = 排列好的左子序 + 排列好的右子序 + root;


}



int main(){
    ios::sync_with_stdio(false);
    string s1,s2;
    while(cin >> s1 >> s2) {
        cout << recovery(s1,s2) << endl;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值