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
注意,%c可以读取换行字符,用%*c,意义为可以跳过一个字符。
题意是将二叉树反转后层序遍历和中序遍历,都是基础···
这个题60%通过率,必须熟稔于心。
#include<cstdio> #include<iostream> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int maxn=110; struct Node{ int lchild,rchild; } node[maxn]; bool notroot[maxn]={false}; int i,j,n,num=0;//n节点数,num当前输出节点数 void print(int id) { printf("%d",id); num++; if(num<n) printf(" "); else printf("\n"); } void inorder(int root) { if(root==-1) return ; inorder(node[root].lchild); print(root); inorder(node[root].rchild); } void BFS(int root) { queue<int> q; q.push(root); while(!q.empty()) { int now=q.front(); q.pop(); print(now); if(node[now].lchild!=-1) q.push(node[now].lchild); if(node[now].rchild!=-1) q.push(node[now].rchild); } } void postorder(int root) { if(root==-1) return; postorder(node[root].lchild); postorder(node[root].rchild); swap(node[root].lchild,node[root].rchild); } int strToNum(char c) { if(c=='-') return -1; else{ notroot[c-'0']=true; return c-'0'; } } int findRoot() { for(i=0;i<n;i++) { if(notroot[i]==false) return i; } } int main() { char lchild,rchild; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%*c%c %c",&lchild,&rchild); node[i].lchild=strToNum(lchild); node[i].rchild=strToNum(rchild); } int root=findRoot(); postorder(root); BFS(root); num=0; inorder(root); return 0; }