Keywords: Invert, Intraverse level traverse
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 N lines 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:
Sample Output:
3 7 2 6 4 0 5 1
Note
- 题意:给出每个节点的左右子树,输出镜像树的inatraverse和level traverse
- 借鉴 1099 Build A Binary Search Tree, 根节点就是没有出现在左右子树的那个
Code
#include<iostream>
#include<fstream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#define MAX 100010
using namespace std;
struct node{
int left;
int right;
}nodes[MAX];
vector <int> input, a;
int main(){
#ifdef _DEBUG
ifstream cin("data.txt");
#endif
int num, cnt = 0, root;
cin >> num;
vector<int> visited (num);
a.resize(num);
input.resize(num);
for(int i = 0; i < num; i++){
char a , b;
cin >> a >> b;
if(a == '-')
nodes[i].left = -1;
else {
nodes[i].left =a - '0';
visited[nodes[i].left]++;
}
if(b == '-')
nodes[i].right = -1;
else {
nodes[i].right =b - '0';
visited[nodes[i].right]++;
}
}
for(int i = 0; i < num; i++){
if(visited[i] == 0) root = i;
}
stack<int> s;
s.push(root);
while(s.size() > 0){
int p = s.top();
while(p >= 0){
p = nodes[p].right; s.push(p);
}
s.pop();
if(s.size() > 0){
p = s.top();
s.pop();
a[cnt++] = p;
s.push(nodes[p].left);
}
}
queue<int> q;
q.push(root);
cout << root;
q.pop();
if(nodes[root].right>= 0) q.push(nodes[root].right);
if(nodes[root].left >= 0) q.push(nodes[root].left);
while(q.size() > 0){
int temp = q.front();
q.pop();
cout << " " << temp;
if(nodes[temp].right>= 0) q.push(nodes[temp].right);
if(nodes[temp].left >= 0) q.push(nodes[temp].left);
}
cout << endl;
for(int i = 0; i < num; i++){
if(i == 0) cout << a[0];
else cout << " " << a[i];
}
return 0;
#ifdef _DEBUG
cin.close();
#endif
return 0;
}