1102. Invert a Binary Tree (25)
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:8 1 - - - 0 - 2 7 - - - - 5 - 4 6Sample Output:
3 7 2 6 4 0 5 1 6 5 7 4 3 2 0 1
#include <iostream>
#include <deque>
#include <cstdio>
#include <stack>
using namespace std;
struct Node{
Node():num(0),pre(-1),left(-1),right(-1){
};
int num,pre,left,right;
}nodes[10];
void Invert(int root){
if(root ==-1 || nodes[root].left == -1 && nodes[root].right == -1)
return ;
else{
int tmp = nodes[root].left;
nodes[root].left = nodes[root].right;
nodes[root].right = tmp;
Invert(nodes[root].left);
Invert(tmp);
}
}
deque<int>dq;
void Leveltravel(int root){
printf("%d",root);
if(nodes[root].left != -1)
dq.push_back(nodes[root].left);
if(nodes[root].right != -1)
dq.push_back(nodes[root].right);
while(!dq.empty()){
int cur = dq.front();
printf(" %d",cur);
dq.pop_front();
int left = nodes[cur].left;
int right = nodes[cur].right;
if(left != -1)
dq.push_back(left);
if(right != -1)
dq.push_back(right);
}
printf("\n");
}
stack<int> ss;
void Inorder(int root){
bool flag = false;
int tmp = nodes[root].left;
ss.push(root);
while(!ss.empty() || tmp != -1){
while(tmp != -1){
ss.push(tmp);
tmp = nodes[tmp].left;
}
int cur = ss.top();
ss.pop();
if(!flag){
flag = true;
printf("%d",cur);
}else
printf(" %d",cur);
tmp = nodes[cur].right;
}
}
int find_root(int n){
for(int i=0;i<n;i++)
if(nodes[i].pre == -1)
return i;
}
int main()
{
int N;
scanf("%d",&N);
for(int i=0;i<N;i++){
char ch1,ch2;
cin >>ch1 >>ch2;
nodes[i].num = i;
if(ch1 != '-'){
nodes[i].left = ch1 - '0';
nodes[nodes[i].left].pre = i;
}
if(ch2 != '-'){
nodes[i].right = ch2 -'0';
nodes[nodes[i].right].pre = i;
}
}
int root = find_root(N);
Invert(root);
Leveltravel(root);
Inorder(root);
return 0;
}