PAT.A1099バイナリ検索ツリーを構築する

目次に戻る

ここに画像の説明を挿入ここに画像の説明を挿入

タイトル

二分木は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

注意点

  1. タイトルはノード番号の関係を直接示すため、バイナリツリーの静的な書き込み方法を使用する方が便利です。
  2. バイナリサーチツリーの場合、中間順序のトラバーサルシーケンスはインクリメンタルであるため、指定された整数シーケンスを小さい順から大きい順に並べ替え、指定されたバイナリツリーの中順序トラバーサルを実行し、並べ替えられたシーケンスの整数を次のように並べ替えます。真ん中の順序のトラバーサルの順序がバイナリツリーに入力され、バイナリ検索ツリーが形成されます。
  3. ルートノードのデフォルトは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;
}
元の記事を177件公開 賞賛5 訪問6661

おすすめ

転載: blog.csdn.net/a1920993165/article/details/105516363