1. 程式人生 > >PAT 1102 Invert a Binary Tree (25 分)

PAT 1102 Invert a Binary Tree (25 分)

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 6

Sample Output:

3 7 2 6 4 0 5 1
6 5 7 4 3 2 0 1




解析

這題用靜態實現就挺好的。因為題目給的是結點編號之間的關係。把二叉樹構建出來,其他都是常規了



Code:

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<queue>
#include<string>
#include<vector>
using namespace
std; struct node { int data; int lchild, rchild; node(int value) :data(value), lchild(-1),rchild(-1){ } }; vector<int> in, layer; vector<node*> Tree(20,nullptr); bool notroot[20]{ false }; void layerorder(int root) { queue<int> q; q.push(root); while (!q.empty()) { int New = q.front(); q.pop(); layer.push_back(Tree[New]->data); if (Tree[New]->lchild != -1) q.push(Tree[New]->lchild); if (Tree[New]->rchild != -1) q.push(Tree[New]->rchild); } } void inorder(int root) { if (root == -1) return; inorder(Tree[root]->lchild); in.push_back(Tree[root]->data); inorder(Tree[root]->rchild); } void invert(int root) { if (root == -1) return; swap(Tree[root]->lchild, Tree[root]->rchild); invert(Tree[root]->lchild); invert(Tree[root]->rchild); } int main() { int N; char node1, node2; scanf("%d", &N); getchar(); for (int i = 0; i < 11; i++) Tree[i] = new node(i); for (int i = 0; i < N; i++) { scanf("%c %c", &node1, &node2); getchar(); if (node1 != '-') { Tree[i]->lchild = node1-'0'; notroot[node1 - '0'] = true; } if(node2 !='-'){ Tree[i]->rchild = node2-'0'; notroot[node2 - '0'] = true; } } int root; for (int i = 0; i < N; i++) { if (!notroot[i]) { root = i; break; } } invert(root); layerorder(root); inorder(root); for (int i = 0; i < N; i++) printf("%d%c", layer[i], i == N - 1 ? '\n' : ' '); for (int i = 0; i < N; i++) printf("%d%c", in[i], i == N - 1 ? '\n' : ' '); return 0; }