PAT(上級レベル)実践1064完全なバイナリ検索ツリー(30ポイント)二分探索木[BST]

Aバイナリ検索ツリー(BST)を再帰的に以下の特性を有するバイナリツリーのように定義されます。

  • ノードの左サブツリーが少ないノードのキーよりもキーでノードのみが含まれています。
  • ノードの右サブツリーを超えるまたはノードのキーと同じキーを持つ唯一のノードを含みます。
  • 左と右のサブツリーどちらも二分探索木でなければなりません。

完全2分木(CBT)は、完全に左から右に充填されているボトムレベルの可能な例外を除いて、充填されている木です。

今、明確な非負整数キーのシーケンスを与えられた、ユニークなBSTは、木もCBTでなければならないことを要求される場合に構成することができます。あなたは出力にこのBSTのレベル順トラバーサル順序を想定しています。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、正の整数N(≤1000)を含みます。次いで、N個の異なる非負の整数キーは次の行に示されています。行のすべての数字は、スペースで区切り、2000よりも大きくないされています。

出力仕様:

各テストケースのために、一列に対応する完全なバイナリ検索ツリーのレベル順トラバーサル順序を印刷します。行のすべての数字は、スペースで区切る必要があり、ラインの末尾に余分なスペースがあってはなりません。

サンプル入力:

10
1 2 3 4 5 6 7 8 9 0

サンプル出力:

6 3 8 1 5 7 9 0 2 4

問題の意味

このツリーの必要な出力シーケンストラバーサルの順序を考えると、ツリーは完全に二分探索木です。

思考

予約限定バイナリ検索ツリーは、注文したので、これだけのシーケンスをソートする必要が先行順を得ることができています。そしてので、木は完全2分木であるので、各ノードのシリアル番号は、非常に簡単に決定することです。トラバーサルシーケンス番号は、実際にノードをソートされます。

コード

#include <algorithm>
#include <cstdio>

using namespace std;

const int MAX_SIZE = 1010;

int n, p = 0, nums[MAX_SIZE], cbt[MAX_SIZE];

void inOrder(int root) {
    if (root > n)
        return;
    inOrder(root * 2);
    cbt[root] = nums[p++];
    inOrder(root * 2 + 1);
}

int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
        scanf("%d", nums + i);

    sort(nums, nums + n);

    inOrder(1);

    for (int i = 1; i <= n; ++i) {
        printf("%d", cbt[i]);
        if (i < n)
            printf(" ");
    }
}
公開された184元の記事 ウォン称賛19 ビュー20000 +

おすすめ

転載: blog.csdn.net/Exupery_/article/details/104202323