二分木で遊ぶ
二分木のミドルオーダートラバーサルとプレオーダートラバーサルを前提として、最初にツリーのミラーインバージョンを作成してから、反転レイヤーオーダートラバーサルのシーケンスを出力してください。いわゆるミラー反転とは、すべての非リーフノードの左右の子を交換することを指します。キー値はすべて、互いに等しくない正の整数であると想定されています。
入力フォーマット:
最初の行を入力して、正の整数N(≤30)を指定します。これは、二分木のノード数です。2行目は、順序どおりの走査シーケンスを示しています。3行目は、プレオーダートラバーサルシーケンスを示しています。数字はスペースで区切られます。
出力フォーマット:
ツリーがトラバースしたシーケンスを1行で反転して出力します。数字は1スペースで区切られ、行の最初と最後に余分なスペースがあってはなりません。
入力サンプル:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
サンプル出力:
4 6 1 7 5 3 2
解決策:
プレオーダー+ミドルオーダーの
手順に従ってバイナリツリーを構築し
ます。ミドルオーダーの左ノードが右ノードの左側にある限り、次の手順を繰り返します。
ルートノードの値は、ポストオーダーの左端のノードの値と同じです。
ルートノードの位置は中位にあります。このとき、ルートノードはツリーを左右に分割します。
。ミドルオーダーに従って、プレオーダーの
左右のサブツリーを決定します。部分的なポイントの数。このルートノードの左右のサブツリーを確立します。
構築されたルートノードを
返します。それ以外の場合は、NULLを返します。
ピット:
ミラー、つまり、出力をトラバースするとき、最初に右、次に左
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int pre[35];
int in[35];
typedef struct node
{
int data;
struct node * left;
struct node * right;
}Node;
/*
1 2 3 4 5 6 7 in
4 1 3 2 6 5 7 pre
*/
Node * create(int inL,int inR,int preL,int preR)
{
if(inL>inR)
return NULL;
Node * root =new Node();
root->data=pre[preL];
int num;
for(int i=inL;i<=inR;i++)
{
if(in[i]==pre[preL])
{
num=i;
break;
}
}
num-=inL;
root->left=create(inL,inL+num-1,preL+1,preL+num);
root->right=create(inL+num+1,inR,preL+1+num,preR);
return root;
}
void bfs(Node *root)
{
queue<Node*>q;
q.push(root);
cout<<root->data;
while(!q.empty())
{
Node * tp=q.front();
q.pop();
if(tp->right!=NULL)
{
q.push(tp->right);
cout<<" "<<tp->right->data;
}
if(tp->left!=NULL)
{
q.push(tp->left);
cout<<" "<<tp->left->data;
}
}
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++)
cin>>in[i];
for(int i=0;i<n;i++)
cin>>pre[i];
Node * root=create(0,n-1,0,n-1);
bfs(root);
return 0;
}