給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裏假設鍵值都是互不相等的正整數。
輸入格式:
輸入第一行給出一個正整數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;
}