チームプログラミングラダートーナメントL2-011楽しい二分木

二分木で遊ぶ

二分木のミドルオーダートラバーサルとプレオーダートラバーサルを前提として、最初にツリーのミラーインバージョンを作成してから、反転レイヤーオーダートラバーサルのシーケンスを出力してください。いわゆるミラー反転とは、すべての非リーフノードの左右の子を交換することを指します。キー値はすべて、互いに等しくない正の整数であると想定されています。

入力フォーマット:

最初の行を入力して、正の整数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;
}


おすすめ

転載: blog.csdn.net/Yang_1998/article/details/88830608