1020のツリー全検索(25分)(2-知られる木を求めて)

--- ---復元コンテンツ始まります

質問の意味:

正の整数N(N <= 30)を入力し、注文、その階層の横断の出力にバイナリツリーの先行順走査を与え。

トリック:

30点は、先頭のデータコード、1E9ノード番号サイズ約左右するので、シリアル構造のストレージノードの使用(1〜N)の数として一本鎖を構成するときに(完全二分木でそれを表します位置)と値。サイズノード31の配列を格納するために使用することができるPTAのウェブサイトに、データは、よりバランスの取れた二分木であってもよいです。

コード:

/ *
30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
* /

#include <ビット/ STDC ++ H>
名前空間STDを使用して、
intのPOS [37]、[37]。
typedefは構造体LV {
int型CNT、インデックス、NUM。
}。
LVレベル[37]。
int型CNT = 0;
ボイドfind_(INT iroot、INT ISTART、INT IEND、INTインデックス){
IF(ISTART> IEND)
のリターン;
レベル[++ CNT] .INDEX =指数;
レベル[CNT] .nu​​m = POS [iroot]。
I = ISTART int型。
(!で[I] = POS [iroot])しばらく
++ I;
find_(iroot -1- IEND + I、ISTART、I-1,2 *指数+ 1)。
find_(iroot-1、I + 1、IEND、2 *指数+ 2)。
}
BOOL CMP(LV、LV B){
IF(a.index = b.index!)
を返すa.index <b.index。
}
メインINT(){
int型のn;
cinを>> N;
(; iがN <; ++ iが0 = INT)のために
CIN >> POS [i]は、
(I 0 = int型、iがN <; ++ i)について
CIN >> [I]において、
find_(N-1,0、N-1,0)。
ソート(レベル+ 1、レベル+ 1 + N、CMP)。
(I 1 = int型、私はCNTを<; ++ i)について
COUT <<レベル[I] .nu​​m <<」「。
COUT <<レベル[CNT] .nu​​m。
0を返します。
}

---終わり---コンテンツを復元

質問の意味:

正の整数N(N <= 30)を入力し、注文、その階層の横断の出力にバイナリツリーの先行順走査を与え。

トリック:

30点は、先頭のデータコード、1E9ノード番号サイズ約左右するので、シリアル構造のストレージノードの使用(1〜N)の数として一本鎖を構成するときに(完全二分木でそれを表します位置)と値。[

コード:

/ *
30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
* /

#include<bits/stdc++.h>
using namespace std;
int pos[37],in[37];
typedef struct lv{
int cnt,index,num;
};
lv level[37];
int cnt=0;
void find_(int iroot,int istart,int iend,int index){
if(istart>iend)
return;
level[++cnt].index=index;
level[cnt].num=pos[iroot];
int i=istart;
while(in[i]!=pos[iroot])
++i;
find_(iroot-1-iend+i,istart,i-1,2*index+1);
find_(iroot-1,i+1,iend,2*index+2);
}
bool cmp(lv a,lv b){
if(a.index!=b.index)
return a.index<b.index;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;++i)
cin>>pos[i];
for(int i=0;i<n;++i)
cin>>in[i];
find_(n-1,0,n-1,0);
sort(level+1,level+1+n,cmp);
for(int i=1;i<cnt;++i)
cout<<level[i].num<<" ";
cout<<level[cnt].num;
return 0;
}

おすすめ

転載: www.cnblogs.com/ldudxy/p/11353950.html