1119.Pre- and Post-order Traversals

題目描述

Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences, or preorder and inorder traversal sequences. However, if only the postorder and preorder traversal sequences are given, the corresponding tree may no longer be unique.

Now given a pair of postorder and preorder traversal sequences, you are supposed to output the corresponding inorder traversal sequence of the tree. If the tree is not unique, simply output any one of them.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤ 30), the total number of nodes in the binary tree. The second line gives the preorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.

Output Specification:

For each test case, first printf in a line Yes if the tree is unique, or No if not. Then print in the next line the inorder traversal sequence of the corresponding binary tree. If the solution is not unique, any answer would do. It is guaranteed that at least one solution exists. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input 1:

7
1 2 3 4 6 7 5
2 6 7 4 5 3 1

Sample Output 1:

Yes
2 1 6 4 7 3 5

Sample Input 2:

4
1 2 3 4
2 4 3 1

Sample Output 2:

No
2 1 3 4

考點

1.樹的三種遍歷方式;
2.前序后序轉(zhuǎn)中序。

思路

1.根據(jù)特點求解
前序的輸出順序為根左右,后序為左右根,因此只要前序的子序列的第一個值等于后序子序列的最后一個值,這個值就是根結(jié)點的值??梢酝ㄟ^這個特點遞歸建樹。
2.中序遍歷
3.如何確定是否唯一?
不唯一的情況就是某棵子樹的根結(jié)點只有一個孩子結(jié)點,那么這個孩子結(jié)點可以是左孩子,也可以是右孩子。反之,如果某棵子樹有左右孩子結(jié)點那么它一定是唯一可確定的,即最終前序和后序兩個數(shù)組一定可以被分割成[a, b][a, b]的形式,即prel=prerpostl=postr。如果prel>prer,那么不可唯一確定。

代碼

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<int> pre, post;
queue<int> in;
int tree[30][2], root, isuniq=1;
void inorder(int &index, int prel,int prer, int postl, int postr) {
    if (prel > prer) {
        isuniq = 0;return;
    }
    index = prel;
    if (prel == prer) return;
    int e = postr;
    while (pre[prel + 1] != post[e]) e--;
    inorder(tree[index][0], prel + 1, prel + e - postl + 1, postl, e);
    inorder(tree[index][1], prel + e - postl + 2, prer, e + 1, postr-1);
}
void inorder(int r) {
    if (tree[r][0] != 0) inorder(tree[r][0]);
    in.push(pre[r]);
    if (tree[r][1] != 0) inorder(tree[r][1]);
}
int main() {
    int n, i, t;
    cin >> n;
    pre.resize(n); post.resize(n);
    for (i = 0; i < n; i++) cin >> pre[i];
    for (i = 0; i < n; i++) cin >> post[i];
    inorder(root, 0, n - 1, 0, n - 1);
    cout << (isuniq == 1 ? "Yes" : "No") << endl;
    inorder(0);
    while (!in.empty()) {
        cout << in.front() << (in.size() == 1 ? "\n" : " ");
        in.pop();
    }
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容