PAT A1064完全なバイナリ検索ツリーの[完全なバイナリ検索ツリー]

タイトル説明

リンク
、ツリーが完全に二分探索木を知られている木の構成の一連のシーケンスは、その層列の先行順走査を見つけます

分析

  • 二分探索木の性質:左のサブツリー<ルート<右部分木、及びトラバーサルinorderを、LDRであるので:シーケンス行きがけ二分探索木はの昇順で得られます
  • バイナリ自然を完了します。配列内の格納順序は、完全なバイナリツリートラバーサル配列の配列であります
  • 概念を混同:一意にバイナリツリーを識別するために、一般的に私たちは一緒に順番に、シーケンスにする必要があります。バイナリツリートラバーサルを確立するためには何が存在しません。まあ、単純に固有のものではありません。ここでは、しかし、完全に二分探索木を定義するため、アレイの割り当てINORDERトラバーサルによって行うことができます。
  • ソート順序の主題は、一連の先行順を得ました。そして、順トラバーサルでは、本質的には、LDRに従い、rootアクセス。我々は、アクセスの割り当ての動作変更できる\を(ノードは、[ルート] = [++ LEN] \) これによりアレイに格納されたシーケンス。最後に、トラバーサルの順序、すなわち、シーケンス順序の出力。
  • 概要:ソート - >変換プログラムを通過するためには、アクセスの割り当てになります - >配列の格納順序を取得 - >シーケンストラバーサルシーケンスを取得
  • 完全なバイナリツリー:ノードが空である:\(I> N- \)ノードが葉である:\(2I> N- \)
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e4+10;
int nodes[maxn];
int n,len;
int a[maxn];

void inorder(int root){
    if(root > n) return;
    inorder(2*root);
    nodes[root] = a[len++]; //将访问改成赋值
    inorder(2*root+1);
}

int main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    inorder(1);
    for(int i=1;i<=n;i++){
        if(i==1) cout<<nodes[i];
        else cout<<" "<<nodes[i];
    }
    cout<<endl;

}

おすすめ

転載: www.cnblogs.com/doragd/p/11280181.html