一、题目描述
Input Specification
Output Specification:
For each test case, print in the first line the level-order, and then in the second line the in-order traversal sequences of the inverted tree. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.
Sample Input:
8
1 -
0 -
2 7
5 -
4 6
Sample Output:
3 7 2 6 4 0 5 1
6 5 7 4 3 2 0 1
二、解题思路
算是比较简单的一道题目,二叉树的翻转,事实上我们只需要改变一下遍历的顺序即可,对于层序遍历,我们先把右孩子放入队列,再把左孩子放入队列,对于中序遍历,我们也是按照右中左的顺序进行遍历即可。
三、AC代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
struct Node
{
int parent = -1, lchild, rchild;
}node[20];
vector<int> level, in;
void levelOrder(int root) //层序遍历(逆)
{
queue<int> q;
q.push(root);
while(!q.empty())
{
int now = q.front();
q.pop();
level.push_back(now);
if(node[now].rchild != -1) q.push(node[now].rchild);
if(node[now].lchild != -1) q.push(node[now].lchild);
}
}
void inOrder(int root) //中序遍历(逆)
{
if(root == -1) return;
inOrder(node[root].rchild);
in.push_back(root);
inOrder(node[root].lchild);
}
void printV(vector<int> v)
{
for(int i=0; i<v.size(); i++) i==0? printf("%d", v[i]) : printf(" %d", v[i]);
printf("\n");
}
int main()
{
int N;
string tmp1, tmp2;
scanf("%d", &N);
for(int i=0; i<N; i++)
{
cin >> tmp1 >> tmp2;
node[i].lchild = tmp1[0] == '-' ? -1 : stoi(tmp1);
node[i].rchild = tmp2[0] == '-' ? -1 : stoi(tmp2);
if(node[i].lchild != -1) node[node[i].lchild].parent = i;
if(node[i].rchild != -1) node[node[i].rchild].parent = i;
}
int root;
for(int i=0; i<N; i++) //寻找根结点
{
if(node[i].parent == -1)
{
root = i;
break;
}
}
levelOrder(root);
inOrder(root);
printV(level);
printV(in);
return 0;
}