洛谷題單指南-二叉樹-P1030 [NOIP2001 普及組] 求先序排列

江城伍月發表於2024-03-15

原題連結:https://www.luogu.com.cn/problem/P1030

題意解讀:已知中序、後序,求先序。

解題思路:

洛谷題單指南-二叉樹-P1827 [USACO3.4] 美國血統 American Heritage非常類似,不在介紹過程,直接給出程式碼。

100分程式碼:

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

string in, post;

//in_l:中序序列的起點,in_r:中序序列的終點,post_l:後序序列的起點,post_r:後序序列的終點
void preorder(int in_l, int in_r, int post_l, int post_r)
{
    if(in_l > in_r) return; //沒有節點
    //先透過後序序列找根節點
    int root = post_r; //根節點位置為後序序列終點

    //在中序序列中找到根節點的位置
    int i = in_l;
    while(in[i] != post[root]) i++;

    cout << post[root]; //遞迴之前輸出根即前序遍歷
    // in_l ~ i-1即左子樹的中序序列, 一共有i-in_l個元素
    // i+1 ~ in_r即右子樹的中序序列, 一共有in_r-i個元素
    // post_l ~ post_l+i-in_l-1即左子樹的後序序列
    // post_l+i-in_l ~ post_r-1即右子樹的後序序列
    preorder(in_l, i - 1, post_l, post_l + i - in_l - 1); //對左子樹遞迴呼叫找根
    preorder(i + 1, in_r, post_l + i - in_l, post_r - 1); //對右子樹遞迴呼叫找根
}

int main()
{
    cin >> in >> post;
    preorder(0, in.size() - 1, 0, post.size() - 1);
    return 0;
}

相關文章