题目

The following is from Max Howell @twitter:

Google: 90% of our engineers use the sofware you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck of. 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 lef 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

题目分析

已知所有节点的左右子节点,求反转二叉树的中序和后序序列

解题思路

思路 01

  1. 输入时,将左右子节点对换,即可完成反转
  2. bfs广度优先遍历,输出层序序列
  3. 递归输出中序序列

思路 02

  1. 将节点关系按照输入保存
  2. 使用后序遍历递归进行二叉树反转(也可使用前序遍历递归进行二叉树反转)
  3. bfs广度优先遍历,输出层序序列
  4. 递归输出中序序列

Code

Code 01(最优)

  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5. const int maxn = 10;
  6. int nds[maxn][2];
  7. int n,cnt;
  8. bool flag[maxn];
  9. void bfs(int root) {
  10. queue<int> q;
  11. q.push(root);
  12. while(!q.empty()) {
  13. int now = q.front();
  14. q.pop();
  15. printf("%d",now);
  16. if(++cnt<n)printf(" ");
  17. if(nds[now][0]!=-1)q.push(nds[now][0]);
  18. if(nds[now][1]!=-1)q.push(nds[now][1]);
  19. }
  20. }
  21. void inOrder(int nd){
  22. if(nd==-1){//nds[nd][0]==-1&&nds[nd][1]==-1
  23. return;
  24. }
  25. inOrder(nds[nd][0]);
  26. printf("%d",nd);
  27. if(++cnt<n)printf(" ");
  28. inOrder(nds[nd][1]);
  29. }
  30. int main(int argc,char * argv[]) {
  31. char f,r;
  32. scanf("%d",&n);
  33. for(int i=0; i<n; i++) {
  34. scanf("%*c%c %c",&r,&f);
  35. if(f=='-')nds[i][0]=-1;
  36. else {
  37. nds[i][0]=f-'0';
  38. flag[nds[i][0]]=true;
  39. }
  40. if(r=='-')nds[i][1]=-1;
  41. else {
  42. nds[i][1]=r-'0';
  43. flag[nds[i][1]]=true;
  44. }
  45. }
  46. //find root
  47. int k=0;
  48. while(k<n&&flag[k])k++;
  49. bfs(k);
  50. printf("\n");
  51. cnt=0;
  52. inOrder(k);
  53. return 0;
  54. }

Code 02

  1. #include <cstdio>
  2. #include <queue>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn = 10;
  6. struct node { // 二叉树的静态写法
  7. int lchild, rchild;
  8. } Node[maxn];
  9. bool notRoot[maxn] = {false}; // 记录是否不是根结点,初始均是根结点
  10. int n, num = 0; // n为结点个数,num为当前已经输出的结点个数
  11. // print函数输出结点id的编号
  12. void print(int id) {
  13. printf("%d", id); // 输出id
  14. num++; // 已经输出的结点个数加1
  15. if(num < n) printf(" "); // 最后一个结点不输出空格
  16. else printf("\n");
  17. }
  18. // 中序遍历
  19. void inOrder(int root) {
  20. if(root == -1) {
  21. return;
  22. }
  23. inOrder(Node[root].lchild);
  24. print(root);
  25. inOrder(Node[root].rchild);
  26. }
  27. // 层序遍历
  28. void BFS(int root) {
  29. queue<int> q; //注意队列里是存地址
  30. q.push(root); //将根结点地址入队
  31. while(!q.empty()) {
  32. int now = q.front(); //取出队首元素
  33. q.pop();
  34. print(now);
  35. if(Node[now].lchild != -1) q.push(Node[now].lchild); //左子树非空
  36. if(Node[now].rchild != -1) q.push(Node[now].rchild); //右子树非空
  37. }
  38. }
  39. // 后序遍历,用以反转二叉树
  40. //void postOrder(int root) {
  41. // if(root == -1) {
  42. // return;
  43. // }
  44. // postOrder(Node[root].lchild);
  45. // postOrder(Node[root].rchild);
  46. // swap(Node[root].lchild, Node[root].rchild); // 交换左右孩子
  47. //}
  48. // 前序遍历,用以反转二叉树
  49. void preOrder(int root) {
  50. if(root == -1) {
  51. return;
  52. }
  53. swap(Node[root].lchild, Node[root].rchild); // 交换左右孩子
  54. preOrder(Node[root].lchild);
  55. preOrder(Node[root].rchild);
  56. }
  57. // 将输入的字符转换为-1或者结点编号
  58. int strToNum(char c) {
  59. if(c == '-') return -1; // “-”表示没有孩子结点,记为-1
  60. else {
  61. notRoot[c - '0'] = true; // 标记c不是根结点
  62. return c - '0'; // 返回结点编号
  63. }
  64. }
  65. // 寻找根结点编号
  66. int findRoot() {
  67. for(int i = 0; i < n; i++) {
  68. if(notRoot[i] == false) {
  69. return i; // 是根结点,返回i
  70. }
  71. }
  72. }
  73. int main() {
  74. char lchild, rchild;
  75. scanf("%d", &n); // 结点个数
  76. for(int i = 0; i < n; i++) {
  77. scanf("%*c%c %c", &lchild, &rchild); // 左右孩子
  78. Node[i].lchild = strToNum(lchild);
  79. Node[i].rchild = strToNum(rchild);
  80. }
  81. int root = findRoot(); // 获得根结点编号
  82. // postOrder(root); // 后序遍历,反转二叉树
  83. preOrder(root); // 前序遍历,反转二叉树
  84. BFS(root); // 输出层序遍历序列
  85. num = 0; // 已输出的结点个数置0
  86. inOrder(root); // 输出中序遍历序列
  87. return 0;
  88. }

PAT Advanced 1102 Invert a Binary Tree (25) [树的遍历]的更多相关文章

  1. PAT甲级——1102 Invert a Binary Tree (层序遍历+中序遍历)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90577042 1102 Invert a Binary Tree ...

  2. 1102. Invert a Binary Tree (25)

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

  3. PAT (Advanced Level) 1102. Invert a Binary Tree (25)

    简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

  4. PAT甲题题解-1102. Invert a Binary Tree (25)-(建树,水题)

    就是把输入给的左孩子右孩子互换一下,然后输出层次遍历和中序遍历. #include <iostream> #include <algorithm> #include <c ...

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

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

  6. PAT (Advanced Level) 1110. Complete Binary Tree (25)

    判断一棵二叉树是否完全二叉树. #include<cstdio> #include<cstring> #include<cmath> #include<vec ...

  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. 1102 Invert a Binary Tree——PAT甲级真题

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

  9. PAT 1102 Invert a Binary Tree

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

随机推荐

  1. emacs 配置文件目录

    在 windows 环境下,emacs 的配置目录可以通过下面几种方式来设置: If the environment variableHOME is set, use the directory it ...

  2. 51nod 1559 车和矩形

    http://www.51nod.com/Challenge/Problem.html#problemId=1559 倘若矩形是受保护的,那么矩形内每一行至少有一个车或者每一列至少有一个车 判断矩形内 ...

  3. Good Bye 2019

    A.Card Game 题目大意:两个人都有共有n张卡牌,每张卡牌上都有一个数xi,没有两张牌上的数相同,且xi不小于1不大于n.每次两个人选出一张牌来,牌上数字大的人赢得此局,如果谁最后手上拥有所有 ...

  4. chrome常用参数

    chrome禁止本地浏览时加载本地其他文件,可以采用添加启动参数的方式来支持 添加参数为 --allow-file-access-from-files 或者 --disable-web-securit ...

  5. POJ 1565:Skew Binary

    Skew Binary Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10676   Accepted: 6807 Desc ...

  6. STL--迭代器设计原则和萃取机制(Traits)

    title: C++ STL迭代器设计原则和萃取机制(Traits) date: 2019-12-23 15:21:47 tags: STL C/C++ categories: STL 迭代器 (it ...

  7. 十六、JavaScript之%运算符

    一.代码如下 二.运行效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" cont ...

  8. 创建一个简单的Spring应用

    环境已经安装完成,接下来创建一个简单的Spring应用. 创建Spring应用步骤: 创建一个maven项目 添加spring库依赖 创建Bean类 添加Bean的xml装配文件 创建主类 运行应用程 ...

  9. Python 简单统记Log 日记 下次用:python的内置logging模块 easy

    环境 win7  先来new一点log 日记   日记包含    "reason=", "error="  两个log级别 存放在D盘下得LOG目录下 先来 生 ...

  10. 【转】selenium技巧 - 通过js来控制滚动条,通过xpath定位最上层的div层

    http://blog.csdn.net/iceryan/article/details/8162703 业务流程:   1.打开此网页 http://nanjing.xiaomishu.com/sh ...