タイトル説明
リンク
、ツリーが完全に二分探索木を知られている木の構成の一連のシーケンスは、その層列の先行順走査を見つけます
分析
- 二分探索木の性質:左のサブツリー<ルート<右部分木、及びトラバーサル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;
}