L2-011 玩轉二叉樹 (25分)

給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裏假設鍵值都是互不相等的正整數。

輸入格式:
輸入第一行給出一個正整數N(≤30),是二叉樹中結點的個數。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數字間以空格分隔。

輸出格式:
在一行中輸出該樹反轉後的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。

輸入樣例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7

輸出樣例:
4 6 1 7 5 3 2

感覺對二叉樹 鏈表之類的基礎數據結構理解並不好,還是多練習一下基礎的東西。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

int n;
int a[50],b[50];
int L[50],R[50];

int dfs(int l,int r,int ll,int rr)
{
    if(l > r || ll > rr)return 0;
    for(int i = l;i <= r;i++)
    {
        if(a[i] == b[ll])
        {
            L[b[ll]] = dfs(l,i - 1,ll + 1,i - l + ll);
            R[b[ll]] = dfs(i + 1,r,i - l + ll + 1,rr);
        }
    }
    return b[ll];
}

void bfs()
{
    queue<int>q;
    q.push(b[1]);
    printf("%d",b[1]);
    
    while(!q.empty())
    {
        int now = q.front();q.pop();
        if(R[now])
        {
            printf(" %d",R[now]);
            q.push(R[now]);
        }
        if(L[now])
        {
            printf(" %d",L[now]);
            q.push(L[now]);
        }
    }
}

int main()
{
    scanf("%d",&n);
    for(int i = 1;i <= n;i++)scanf("%d",&a[i]);
    for(int i = 1;i <= n;i++)scanf("%d",&b[i]);
    
    dfs(1,n,1,n);
    bfs();
    
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章