目次に戻る
タイトル
二分木はN個のノード(ノード番号0〜N-1)を持ち、各ノードの左と右の子ノードの数を示します(-1はありません)。次に、N個の整数のシーケンスが与えられます。これらの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
//output
58 25 82 11 38 67 45 73 42
注意点
- タイトルはノード番号の関係を直接示すため、バイナリツリーの静的な書き込み方法を使用する方が便利です。
- バイナリサーチツリーの場合、中間順序のトラバーサルシーケンスはインクリメンタルであるため、指定された整数シーケンスを小さい順から大きい順に並べ替え、指定されたバイナリツリーの中順序トラバーサルを実行し、並べ替えられたシーケンスの整数を次のように並べ替えます。真ん中の順序のトラバーサルの順序がバイナリツリーに入力され、バイナリ検索ツリーが形成されます。
- ルートノードのデフォルトは0です。
#include<bits/stdc++.h>
using namespace std;
int n,lc,rc,data[110],pos=0;
struct Node{
int data,lc,rc;
}node[110];
void ininsert(int root){
if(root==-1)return;
ininsert(node[root].lc);
node[root].data=data[pos++];
ininsert(node[root].rc);
}
void BFS(int root){
queue<int> q;
q.push(root);
int num=0;
while(!q.empty()){
int now=q.front();
q.pop();
printf("%d",node[now].data);
num++;
if(num<n)printf(" ");
if(node[now].lc!=-1)q.push(node[now].lc);
if(node[now].rc!=-1)q.push(node[now].rc);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
scanf("%d%d",&lc,&rc);
node[i].lc=lc;
node[i].rc=rc;
}
for(int i=0;i<n;i++)scanf("%d",&data[i]);
sort(data,data+n);
ininsert(0);//中序遍历插入元素
BFS(0)//层次遍历
return 0;
}