1. 有这样一个经典结论:中序序列可以和先序序列、后序序列、层序序列中的任意一个来构建唯一的二叉树,而后三者两两搭配或者三个一起上都不行。因为从本质上来说,后三者都只提供根结点,只有通过中序才能区分左右子树。

2. 本题用一句话概括就是:根据后序序列和中序序列得到层序序列。

分为两个步骤,1)根据后序序列和中序序列创建树 2)对构建好的树进行层序遍历

分别用函数实现Node* create(int postL,int postR,int inL,int inR)void LayerOrder(Node* root)

3. 创建二叉树的主要思想是,根据后序序列得到当前的根节点,然后在中序序列中确定这个根节点的位置,然后可以得到左子树的结点个数,进一步确定左右子树对应的中序和后序序列,进行递归。

4. 层序遍历即BFS最通用的模板。

AC代码

#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>using namespace std;const int maxn = 30;int post[maxn];
int in[maxn];
int n;//结点总数 struct Node{int data;Node* left;Node* right;
};Node* create(int postL,int postR,int inL,int inR){if(postL>postR)return NULL;Node* root = new Node;//当前二叉树的根节点root->data = post[postR];//当前根节点一定是后序序列的最后一个 int k;for(k = inR;k >= inL;k--){if(in[k]==post[postR])break;//找到当前根结点在中序序列中的位置k }int leftNum = k - inL;//左子树的个数root->left = create(postL,postL+leftNum-1,inL,k-1);root->right = create(postL+leftNum,postR-1,k+1,inR);return root;
}void LayerOrder(Node* root){queue<Node*> que;que.push(root);while(!que.empty()){Node* top = que.front();printf("%d",top->data);n--;if(n)printf(" ");que.pop();if(top->left!=NULL)que.push(top->left);if(top->right!=NULL)que.push(top->right);}
}int main(){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&post[i]);}for(int i=0;i<n;i++){scanf("%d",&in[i]);}//根据后序和中序序列创建二叉树 Node* root = create(0,n-1,0,n-1);LayerOrder(root);return 0;
}

1020 Tree Traversals相关推荐

  1. 1020. Tree Traversals (25)

    题目链接:http://www.patest.cn/contests/pat-a-practise/1020 题目: 1020. Tree Traversals (25) 时间限制 400 ms 内存 ...

  2. PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树

    文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列. 分析: 后序遍历:先 左子树.右子树 ,最后再遍历根结点. 中序遍历:先左子树,再根 ...

  3. 1020. Tree Traversals (25) PAT甲级真题

    之前我看了这道题,实在是看不懂网上的解题答案,他们的具体思路基本上就是通过后续遍历和中序遍历,直接推出层次遍历. 我苦思冥想了半天,是在没看懂这种思路,于是想了一个笨点的但是也比较好理解的思路,通过后 ...

  4. 【详细注解】1020 Tree Traversals (25 分)

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Suppose that all the keys in a binary tree are distinct positive ...

  5. PAT 1020. Tree Traversals

    题目:http://pat.zju.edu.cn/contests/pat-a-practise/1020 题解: 题意就是给一个二叉树的后序和中序,然后确定这棵二叉树,然后层序输出这棵树. 主要思路 ...

  6. 1020 Tree Traversals (25 分) 【难度: 中 / 知识点: 哈希表建树 遍历树】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805485033603072 第一步: 建树 第二步: 遍历树 #incl ...

  7. 1086 Tree Traversals Again

    1. 这题的核心部分是,根据二叉树的先序序列和中序序列求后序序列.等于是在1020 Tree Traversals这一题的基础上,把怎么得到先序序列和中序序列的难度加大了,不是直接给出,而是要曲折一点 ...

  8. PAT甲级1086 Tree Traversals Again:[C++题解]二叉树中序序列、栈、求后序遍历

    文章目录 题目分析 题目链接 题目分析 分析: 给定栈模拟的二叉树的中序序列. 我们可以发现一些性质: 1 第一个值是根结点. 2 对于所有的push操作,如果上一个是push,该结点就是上一个结点的 ...

  9. 03-树3 Tree Traversals Again

    题目 An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For exam ...

最新文章

  1. ASP.net session 使用总结(2)
  2. 如何复制一个目录里面的所有目录和文件
  3. Linux - MiniFtp实现
  4. uva 11400 - Lighting System Design(动态规划 最长上升子序列问题变型)
  5. 安装 | CCS5.5安装包与licence以及安装教程
  6. Anaconda套件,精簡版miniconda
  7. UVa1584 - Circular Sequence
  8. dubbo yml配置_Dubbo常见配置说明
  9. 搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
  10. 简单Git入门本地仓库同步到远程GitHub仓库
  11. 【多商户招商自营多元化功能】
  12. linux(ubuntu)下安装postgresql+pgAdmin4
  13. 数据库五种约束以及添加方法
  14. 驱动板LVDS输出接口(发送器),液晶面板LVDS输入接口(接收器)
  15. 计算机关机的命令,电脑关机命令是什么
  16. 三菱PLC基础知识 辅助继电器M
  17. flink 作业提交流程
  18. c语言编程计算缴税,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  19. 自动化测试平台(十三):接口自动化框架与平台对比及应用场景分析及设计思路分享
  20. 天下武功,唯快不破 - O'Reilly Velocity China 2011 PPT汇总

热门文章

  1. 如何编辑PDF文件,PDF编辑器如何使用
  2. CentOS目录结构超详细版
  3. 微信小程序 - 富文本图片宽度自适应(正则)
  4. Socketserver 笔记
  5. LeetCode 76. Minimum Window Substring / 567. Permutation in String
  6. Day2 - Python基础2作业【文件操作--购物车程序(用户操作及商户操作)】
  7. iOS更改AppIcon
  8. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer
  9. HUST 1586 数字排列
  10. Brian 的 Perl 问题之万能指南