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
由于这道题没有给出根节点所以需要自己去求,其他没有什么难点。注意题目要求的是将左右节点交换输出,所以只要在输入的时候就交换就好,剩下的只需要一个层次遍历和中序遍历。
ac代码
#include <stdio.h> #include <string> #include <stdlib.h> #include <string.h> #include <queue> using namespace std; struct node { node():l(-1),r(-1){}; //对节点的初始化,默认情况下左右均为-1 int l,r,id; }; node tree[15]; int notree[15]; int f1=1,f2; void inorder(int root) //中序遍历 { if(tree[root].l!=-1) { inorder(tree[root].l); } if(f1) { f1=0; printf("%d",root); } else printf(" %d",root); if(tree[root].r!=-1) { inorder(tree[root].r); } } int main() { int i,n,temp,root; char l[5],r[5]; scanf("%d",&n); for(i=0;i<n;i++) { tree[i].id=i; } for(i=0;i<n;i++) { scanf("%s%s",r,l); if(r[0]!='-') { temp=atoi(r); tree[i].r=temp; notree[temp]=1; } if(l[0]!='-') { temp=atoi(l); tree[i].l=temp; notree[temp]=1; } } for(i=0;i<n;i++) { if(notree[i]!=1) { root=i; break; } } queue<node> tr; //层次遍历 tr.push(tree[root]); f2=1; while(!tr.empty()) { node tem = tr.front(); tr.pop(); if(f2==1) { printf("%d",tem.id); f2=0; } else printf(" %d",tem.id); if(tem.l!=-1) { tr.push(tree[tem.l]); } if(tem.r!=-1) { tr.push(tree[tem.r]); } } printf("\n"); inorder(root); printf("\n"); return 0; }