本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90577042

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 (≤) 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

题目大意:将二叉树每个节点的左右孩子交换位置,然后分别层序和中序输出。第 i 行代表了节点 i 的左右孩子的信息,先左后右,'-' 表示没有该方向的子节点。

思路:用数组tree存储树。

读取字符串然后将其转成int型变量,空节点'-' 用-1代替。

只要在读取数据的时候交换左右孩子的位置就行。

读取数据的时候用bool数组R对每个孩子节点进行标记,然后遍历数组寻找根节点(即没有被标记过的节点)

 #include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
struct node {
int left, right;
};
vector <node> tree;
bool flag = false;//用于中序遍历标记第一个输出的节点
int getNum(string &s);
void levelOrder(int t);
void inOrder(int t);
int main()
{
int N, root;
scanf("%d", &N);
tree.resize(N);
vector <bool> R(N, true);
for (int i = ; i < N; i++) {
string left, right;
cin >> left >> right;
tree[i].left = getNum(right);
tree[i].right = getNum(left);
if (tree[i].left != -)
R[tree[i].left] = false;
if (tree[i].right != -)
R[tree[i].right] = false;
}
for (int i = ; i < N; i++)
if (R[i]) {
root = i;
break;
}
levelOrder(root);
printf("\n");
inOrder(root);
printf("\n");
return ;
}
void inOrder(int t) {
if (t != -) {
inOrder(tree[t].left);
if (flag)
printf(" ");
if (!flag)
flag = true;
printf("%d", t);
inOrder(tree[t].right);
}
}
void levelOrder(int t) {
queue <int> Q;
Q.push(t);
while (!Q.empty()) {
t = Q.front();
printf("%d", t);
Q.pop();
if (tree[t].left != -) {
Q.push(tree[t].left);
}
if (tree[t].right != -) {
Q.push(tree[t].right);
}
if (!Q.empty())
printf(" ");
}
}
int getNum(string& s) {
if (s[] == '-')
return -;
int n = ;
for (int i = ; i < s.length(); i++)
n = n * + s[i] - '';
return n;
}

PAT甲级——1102 Invert a Binary Tree (层序遍历+中序遍历)的更多相关文章

  1. PAT甲级——A1102 Invert a Binary Tree

    The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...

  2. PAT Advanced 1102 Invert a Binary Tree (25) [树的遍历]

    题目 The following is from Max Howell @twitter: Google: 90% of our engineers use the sofware you wrote ...

  3. Leetcode 94. Binary Tree Inorder Traversal (中序遍历二叉树)

    Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ...

  4. 094 Binary Tree Inorder Traversal 中序遍历二叉树

    给定一个二叉树,返回其中序遍历.例如:给定二叉树 [1,null,2,3],   1    \     2    /   3返回 [1,3,2].说明: 递归算法很简单,你可以通过迭代算法完成吗?详见 ...

  5. 【PAT甲级】1102 Invert a Binary Tree (25 分)(层次遍历和中序遍历)

    题意: 输入一个正整数N(<=10),接着输入0~N-1每个结点的左右儿子结点,输出这颗二叉树的反转的层次遍历和中序遍历. AAAAAccepted code: #define HAVE_STR ...

  6. 1102 Invert a Binary Tree——PAT甲级真题

    1102 Invert a Binary Tree The following is from Max Howell @twitter: Google: 90% of our engineers us ...

  7. PAT 1102 Invert a Binary Tree[比较简单]

    1102 Invert a Binary Tree(25 分) The following is from Max Howell @twitter: Google: 90% of our engine ...

  8. PAT 1102 Invert a Binary Tree

    The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...

  9. 1102. Invert a Binary Tree (25)

    The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...

随机推荐

  1. JAVA- 成员变量与局部变量的区别

    成员变量与局部变量的区别 成员变量是定义在方法之外,类之内的局部变量是定义在方法之内的. 作用上的区别: 1.成员变量的作用是用于描述一类事物的公共属性的. 2.局部变量的作用就是提供一个变量给方法内 ...

  2. python列表切片

    Python中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组. 格式:[start:end:step] start:起始索引,从0开始,-1表示结束 end:结束索引 step:步 ...

  3. cocos2d-x中CCScrollView纵向展示

    最近写CCScrollView遇到很多问题,样式是竖直的类似tableview,在此记录下: CCLayer* layer; 初始化scrollview内容器层 layer = CCLayer::cr ...

  4. BZOJ 1626 [Usaco2007 Dec]Building Roads 修建道路:kruskal(最小生成树)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1626 题意: 有n个农场,坐标为(x[i],y[i]). 有m条原先就修好的路,连接农场( ...

  5. phpunit 入门

    话说,使用phpunit还是处于好奇之心,为什么以前一直没使用呢?主要是嫌麻烦,小项目,前后端都是自己写,几个人就完成的工作,没必要弄的那么麻烦.好了,废话不多说,让我们一起来感受下phpunit吧! ...

  6. linux命令学习笔记(24):Linux文件类型与扩展名

    Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序 而创建的比如file.txt.file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux ...

  7. ACM学习历程——HDU5017 Ellipsoid(模拟退火)(2014西安网赛K题)

    ---恢复内容开始--- Description Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distanc ...

  8. python script

    1.tab键自动补全(每次导入时要将脚本的路径加入到sys.path中) import sysimport readlineimport rlcompleterimport atexitimport ...

  9. Python3解leetcode Best Time to Buy and Sell Stock II

    问题描述: Say you have an array for which the ith element is the price of a given stock on day i. Design ...

  10. 制作HUD

    转自:http://www.cnblogs.com/NEOCSL/archive/2012/03/05/2380341.html 1. HUD不仅仅能提供基本的显示信息给玩家,例如玩家的生命值等.在I ...