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
N个结点(编号0~N-1;N不超过10)
接着N行分别为编号0~N-1对应点的 右结点编号 左结点编号(如果没有结点就是-)
要求输出这个二叉树的层次遍历的 、中序遍历的
这是这次pat2015中25分的,也是这次pat考试中唯一一个ac并且一次就ac的
评测结果
时间 | 结果 | 得分 | 题目 | 语言 | 用时(ms) | 内存(kB) | 用户 |
---|---|---|---|---|---|---|---|
9月12日 20:43 | 答案正确 | 25 | 1102 | C++ (g++ 4.7.2) | 1 | 308 | datrilla |
测试点
测试点 | 结果 | 用时(ms) | 内存(kB) | 得分/满分 |
---|---|---|---|---|
0 | 答案正确 | 1 | 308 | 13/13 |
1 | 答案正确 | 1 | 180 | 5/5 |
2 | 答案正确 | 1 | 180 | 5/5 |
3 | 答案正确 | 1 | 308 | 2/2 |
#include<iostream> #include<vector> #include<queue> using namespace std; struct trees { int child[2]; void functrees(int ll, int rr) { child[0] = ll; child[1] = rr; } }; void level_order(vector<trees>*erCharShu,int root) { queue<int>q; int size; q.push(root); cout << root; while (!q.empty()) { size = q.size(); while (size--) { root = q.front(); q.pop(); if ((*erCharShu)[root].child[0]!= -1) { cout << " " << (*erCharShu)[root].child[0]; q.push((*erCharShu)[root].child[0]); } if ((*erCharShu)[root].child[1] != -1) { cout << " " << (*erCharShu)[root].child[1]; q.push((*erCharShu)[root].child[1]); } } } cout << endl; } void in_order(vector<trees>*erCharShu,int root,int *alltag) { if ((*erCharShu)[root].child[0] != -1) in_order(erCharShu, (*erCharShu)[root].child[0], alltag); if (1 == (*alltag)) { cout << root; (*alltag)++; } else cout << " " << root; if ((*erCharShu)[root].child[1] != -1) in_order(erCharShu, (*erCharShu)[root].child[1], alltag); } int main() { int N,i,ll,rr; cin >> N; char r,l; vector<bool>flag(N, false); vector<trees>erCharShu(N); for (i = 0; i < N; i++) { cin >> r >> l; if (r == '-')rr = -1; else { rr = r -'0'; flag[rr] = true; } if (l == '-')ll = -1; else { ll = l -'0'; flag[ll] = true; } erCharShu[i].functrees(ll,rr); } for (i = 0; i < N&&flag[i]; i++); level_order(&erCharShu, i); ll = 1; in_order(&erCharShu, i, &ll); cout << endl; system("pause"); return 0; }