Aバイナリ検索ツリー(BST)を再帰的に以下の特性を有するバイナリツリーのように定義されます。
ノードの左サブツリーが少ないノードのキーよりもキーでノードのみが含まれています。
ノードの右サブツリーを超えるまたはノードのキーと同じキーを持つ唯一のノードを含みます。
左と右のサブツリーどちらも二分探索木でなければなりません。
バイナリツリーの構造と異なる整数キーのシーケンスが与えられると、ツリーにこれらのキーを充填する唯一の方法があるように得られた木を満たすBSTの定義。あなたは、そのツリーの出力レベル順トラバーサル順序になっています。試料を図1及び2で示されています。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、ツリー内のノードの総数である正の整数N(≤100)を与えます。次のN行はそれぞれのノードは0からN-1まで番号が付けられていることを条件とする左およびフォーマットleft_indexノードright_indexの右子供を含み、0は常にルートです。一人の子供が欠落している場合は、-1 NULLの子ポインタを表します。最終的にN個の異なる整数キーが最後の行に示されています。
出力仕様:
各テストケースのために、一列にそのツリーのレベル順トラバーサル順序を印刷します。すべての数字は行の末尾に余分なスペースを、スペースで区切らなければなりません。
サンプル入力:
9
1 6
2 3
-1 -1
-1 4
5 -1
-1 -1
7 -1
-1 8
-1 -1
73 45 11 58 82 25 67 38 42
サンプル出力:
58 25 82 11 38 67 45 73 42
アイデア:
1.入力:
係る観察図を図所与のノードプレオーダートラバーサル連続数字入力ノード情報が最初トラバーサルに従って与えられています。したがって、構造は、ノードによってベクトルを格納されている全てのノード、添字は点のノード番号であるベクトルを表現は、順次このツリー構造内の入力情報を読み取ることのみが必要です。
2.処理:
構築ツリートラバーサル順序、特定の非減少得られた配列(二分探索木)。こうして第一ソートキーと、ツリートラバーサルシーケンス、順次割り当てられたキー値。これは、バイナリ検索ツリー風雲良いを構築することができます。
3.出力:
出力キューのシーケンスを使用して。
出典:
#include<bits/stdc++.h>
#include<stdio.h>
#define Max 101
using namespace std;
typedef struct node{
int key;
int left;
int right;
}Node;
vector<Node> Tree;
int k[Max];
int cnt=0;
void in_travel(int s)
{
if(Tree[s].left!=-1)
in_travel(Tree[s].left);
Tree[s].key=k[cnt++];
if(Tree[s].right!=-1)
in_travel(Tree[s].right);
}
int main()
{
int n;cin>>n;
Tree.resize(n+1);
for(int i=0;i<n;i++)
scanf("%d %d",&Tree[i].left,&Tree[i].right);
for(int i=0;i<n;i++)
cin>>k[i];
sort(k,k+n);
in_travel(0);
queue<int> que;
que.push(0);
int f=1;
while(!que.empty())
{
int t=que.front();
que.pop();
if(f)
{
cout<<Tree[t].key;
f=0;
}
else
cout<<" "<<Tree[t].key;
if(Tree[t].left!=-1)que.push(Tree[t].left);
if(Tree[t].right!=-1)que.push(Tree[t].right);
}
}