二叉の木の遍歴(再帰)

1782 ワード

1058:二叉の木は時間制限を巡回します. 1セット  メモリ制限: 128 MB
送信: 18  解決: 8
[提出][状態][検討版]
テーマの説明
二叉の木Tについては、先の順序で遍歴し、中の順序で遍歴し、後の順序で三つのエルゴード方式を経ることができる.ここでは、二叉樹の最初の順序を与えることを要求します.シーケンスを巡回し、その広さを優先的に巡回します. 
入力
第一の行為は整数t(0)です.
出力
各テストケースの個々の行のために、優先的にシーケンスを巡回出力します.
サンプル入力
2DBACEGF ABCDEFGBCAD CBAD
サンプル出力
DBEACGFBCAD
ヒント
本題は主に二叉樹の遍歴に対する理解をテストします.先の順序と中の順序によって二叉樹を作成してから、二叉樹に対して階層的な遍歴を行う必要があります.
ACソース:
#include 
#include 
#include 
#include 
#include 
using namespace std;
struct node
{
	char value;
	node* lft;
	node* rgt;
	node(char v):value(v),lft(0),rgt(0){}
};

node* build_tree(vector x,vector y)
{
	if(x.empty()&&y.empty())
		return nullptr;
	node* root=new node(x.front());
	vector A1,A2,B1,B2;
	int cnt=0;
	while(y[cnt]!=x.front())
		cnt++;
	for(int i=1;i<=cnt;++i)
		A1.push_back(x[i]);
	for(int i=0;ilft=build_tree(A1,A2);
	root->rgt=build_tree(B1,B2);
	return root;
}
void bfs(node* root)
{
	queue que;
	que.push(root);
	while(!que.empty())
	{
		auto nd=que.front();que.pop();
		cout<value;
		if(nd->lft)
			que.push(nd->lft);
		if(nd->rgt)
			que.push(nd->rgt);
	}
}
int T;
int main()
{
	cin>>T;
	while(T--)
	{
		vector x,y;
		char s1[30],s2[30];
		scanf("%s %s",s1,s2);
		for(int i=0;s1[i];i++)
			x.push_back(s1[i]);
		for(int i=0;s2[i];i++)
			y.push_back(s2[i]);
		node* root=build_tree(x,y);
		bfs(root);
		cout<