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 6
Sample Output:
3 7 2 6 4 0 5 1 6 5 7 4 3 2 0 1
1 #include<stdio.h> 2 #include<string> 3 #include<iostream> 4 #include<string.h> 5 #include<sstream> 6 #include<vector> 7 #include<map> 8 #include<stdlib.h> 9 #include<queue> 10 using namespace std; 11 12 struct node 13 { 14 node():l(-1),r(-1){} 15 int l,r,id; 16 }; 17 18 node Tree[15]; 19 bool notroot[15]; 20 bool fir = 1; 21 void inoder(int root) 22 { 23 if(Tree[root].l != -1) 24 { 25 inoder(Tree[root].l); 26 } 27 if(fir) 28 { 29 fir = 0; 30 printf("%d",root); 31 } 32 else printf(" %d",root); 33 if(Tree[root].r != -1) 34 { 35 inoder(Tree[root].r); 36 } 37 } 38 int main() 39 { 40 int n,tem; 41 char l[5],r[5]; 42 scanf("%d",&n); 43 for(int i = 0;i <n;++i) 44 { 45 Tree[i].id = i; 46 } 47 for(int i = 0;i <n;++i) 48 { 49 scanf("%s%s",r,l); 50 if(l[0] != ‘-‘) 51 { 52 tem = atoi(l); 53 Tree[i].l = tem; 54 notroot[tem] = 1; 55 } 56 if(r[0] != ‘-‘) 57 { 58 tem = atoi(r); 59 Tree[i].r = atoi(r); 60 notroot[tem] = 1; 61 } 62 } 63 int root; 64 for(int i = 0;i <n;++i) 65 { 66 if(!notroot[i]) 67 { 68 root = i; 69 break; 70 } 71 } 72 queue<node> qq; 73 qq.push(Tree[root]); 74 bool fir2 = 1; 75 while(!qq.empty()) 76 { 77 node ntem = qq.front(); 78 qq.pop(); 79 if(fir2) 80 { 81 fir2 = 0; 82 printf("%d",ntem.id); 83 } 84 else printf(" %d",ntem.id); 85 if(ntem.l != -1) 86 { 87 qq.push(Tree[ntem.l]); 88 } 89 if(ntem.r != -1) 90 { 91 qq.push(Tree[ntem.r]); 92 } 93 } 94 printf("\n"); 95 inoder(root); 96 printf("\n"); 97 return 0; 98 }