一、题目
The following is from Max Howell @twitter:
Google: 90% of our engineers use the software you wrote (Homebrew), but you can't invert a binary tree on a whiteboard so fuck off.
Now it's your turn to prove that YOU CAN invert a binary tree!
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N−1. Then Nlines follow, each corresponds to a node from 0 to N−1, and gives the indices of the left and right children of the node. If the child does not exist, a -
will be put at the position. Any pair of children are separated by a space.
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
二、题目大意
给出原二叉树的每个结点的左右孩子,反转一棵二叉树,输出它的层序和前序遍历。
三、考点
树、DFS
四、注意
1、使用struct node{}建树,注意 - 的处理,可以将树左右孩子初始化-1;
2、递归反转;
3、递归获得中序。
五、代码
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
struct node {
int val;
int left=-1, right=-1;
};
vector<node> vec;
vector<int> vec_in;
void invertTree(int root) {
if(vec[root].left!=-1)
invertTree(vec[root].left);
if (vec[root].right != -1)
invertTree(vec[root].right);
swap(vec[root].left, vec[root].right);
}
void dfs(int root) {
if (vec[root].left != -1)
dfs(vec[root].left);
vec_in.push_back(root);
if (vec[root].right != -1)
dfs(vec[root].right);
}
int main() {
//read
int n;
cin >> n;
vec.resize(n);
vector<bool> show(n, false);
//read and build tree
for (int i = 0; i < n; ++i) {
string s1, s2;
cin >> s1 >> s2;
if (s1 != "-") {
vec[i].left = stoi(s1);
show[stoi(s1)] = true;
}
if (s2 != "-") {
vec[i].right = stoi(s2);
show[stoi(s2)] = true;
}
}
//find root
int root;
for (int i = 0; i < n; ++i) {
if (show[i] == false) {
root = i;
break;
}
}
//invert
invertTree(root);
//level order
vector<int> vec_level;
queue<int> que;
que.push(root);
while (!que.empty()) {
int r = que.front();
que.pop();
vec_level.push_back(r);
if (vec[r].left != -1)
que.push(vec[r].left);
if (vec[r].right != -1)
que.push(vec[r].right);
}
//output level
for (int i = 0; i < n; ++i) {
if (i != 0)
cout << " ";
cout << vec_level[i];
}
cout << endl;
//in-order
dfs(root);
//output in
for (int i = 0; i < n; ++i) {
if (i != 0)
cout << " ";
cout << vec_in[i];
}
system("pause");
return 0;
}