Thinking 如果给你一颗二叉树的前序序列和中序序列,让你输出它的后序序列,你会怎么做呢?

也许很多同学能够很快的在纸上将一颗简单的二叉树画出来,但如果真正让你将自己的思路转换为算法,你会去怎样实现呢?这就是今天我要做的事情。

二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点。
可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。
举个例子,前序 5 3 2 4 8 6 10 中序 2 3 4 5 6 8 10

首先,5肯定是二叉树的根节点,然后5在中序里面的位置是3号(从0开始),此位置前面的是左子树中的节点,右面的是右子树的节点,即5 || 3 2 4 || 8 2 6 , 2 3 4 || 5 || 6 8 10,对左子树序列、右子树序列继续上述过程,直至结束。由后序和中序求前序也是像类似的思想。但是仅仅知道前序和后序无法确定二叉的形状。比如前序 1 2 3 后序 3 2 1 则下面两种情况都符合:

附上代码,哦对了,还有百练链接,有兴趣的小伙伴可以去做一下:题目链接

#include <bits/stdc++.h>using namespace std;
#define maxn 30typedef struct Tree{Tree *lson, *rson;char val;
} *binary_tree;void dfs(binary_tree* T, string s1, string s2){*T = (Tree *)calloc(1, sizeof(Tree));(*T)->val = s1[0];if(s1.size() == 1){return;}int index;for(index = 0; index < s2.size(); index++){if(s2[index] == s1[0]){break;}}int left_length = index;int right_length = s1.size() - left_length - 1;if(left_length > 0){dfs(&(*T)->lson, s1.substr(1, left_length), s2.substr(0, left_length));}if(right_length > 0){dfs(&(*T)->rson, s1.substr(1 + left_length, right_length), s2.substr(1 + left_length, right_length));}
}void print_ans(Tree* T){if(T->lson != NULL){print_ans(T->lson);}if(T->rson != NULL){print_ans(T->rson);}cout << T->val;
}int main(){string str_1, str_2;while(cin >> str_1 >> str_2){binary_tree T;dfs(&T, str_1, str_2);print_ans(T);cout << endl;}return 0;
}

二叉树 | 根据前序中序遍历重建二叉树相关推荐

  1. 二叉树题目 ----7 前序中序遍历构造二叉树

    前序中序遍历构造二叉树 思路 在前序中找根结点 根据根结点 + 中序,分成左右两棵子树 根据子树长度,把前序分成左右两颗子树 递归处理子树 /*** Definition for a binary t ...

  2. 栈的亚特兰数与二叉树的前序中序遍历序列

    栈的亚特兰数与二叉树的前序中序遍历 @(算法学习) 已经熟知的是二叉树的中序遍历和先序遍历可以唯一确定一棵树. 更有趣的知识点是,以先序遍历序列作为入栈序列,那么出栈序列恰为中序遍历.这样就把两种遍历 ...

  3. 暑假博客二:由前序中序遍历生成二叉树

    首先我们要知道前序遍历,中序遍历生成二叉树的顺序: 前序遍历:先遍历根节点 再遍历左子树 最后遍历右子树 中序遍历:先遍历左子树 再遍历根节点 最后遍历右子树 我们理一理不用编程的思路来看这个问题: ...

  4. 根据二叉树的前序遍历和中序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  5. 二叉树(14)----由前序遍历和中序遍历重建二叉树,递归方式

    相关链接: 链表总结----链表面试题合集 二叉树----二叉树面试题合集 1.二叉树定义 typedef struct BTreeNodeElement_t_ {void *data; } BTre ...

  6. 根据二叉树前序遍历和中序遍历重建二叉树

    剑指 Offer 07. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3, ...

  7. 前序遍历+中序遍历重建二叉树

    文章目录 题目 AC代码 题目 本题链接:剑指 Offer 07. 重建二叉树 注:链接题目仅代表和本题大体相似 因为是考研笔试,本题代码以C语言去写 AC代码 代码解释:本题要求就是给定两个序列:分 ...

  8. C/C++面试题—重建二叉树【前序 + 中序- 重建二叉树 和 后序 + 中序 - 重建二叉树】

    题目介绍 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{ ...

  9. 通过前序遍历和中序遍历构建二叉树 python实现

    前言 通过前序遍历和中序遍历构建二叉树的原理,主要是找前序遍历根节点在中序遍历中的位置,然后将二叉树而成左子树和右子树,然后依次进行这样的操作,思路还是比较简单的 代码 class Node:def ...

最新文章

  1. Linux安装Nodejs
  2. 最小生成树、拓扑排序、单源最短路径
  3. 【Socket网络编程】11.网络编程中的 数据封装 和 数据拆封
  4. SegAttnGAN: Text to Image Generation with Segmentation Attention 论文解读
  5. LG P4074 [WC2013] 糖果公园(带修莫队,树上莫队)
  6. 您已从远程计算机注销,您无法从 Windows Server 2008 R2 中的远程桌面会话注销
  7. CircularFifoQueue队列API
  8. [Codeforces 920E]Connected Components?
  9. SVM -支持向量机原理详解与实践之四
  10. java将多张图片合成视频
  11. H5新增音频标签-audio
  12. 用Verilog实现数字钟
  13. mysql tidb 删除延迟_TiDB DM踩坑实践总结
  14. 数据挖掘:数据清洗——缺失值处理
  15. 计算机理论参考文献,计算机理论英文参考文献 计算机理论论文参考文献哪里找...
  16. 【每日新闻】倪光南:“中国芯”切勿重硬轻软;美国研发出可直接在皮肤上打印的3D打印技术...
  17. 如何写好一篇优秀的硕士毕业论文
  18. linux 怎么看浏览器,Linux下浏览器比比看
  19. 无线渗透之WiFi密码的监听
  20. .net 导出excel时,excel的临时文件不存放在服务器上,打开共享盘Excel文件每次保存之后都会保留.TMP的临时文件...

热门文章

  1. Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
  2. 使用Response.Redirect 两种方法打开一个新窗口
  3. wordpress导航页采用分类目录排序
  4. SAMBA的一些特殊设置
  5. [NIO-1]缓冲区
  6. MySQL8.0 - 新特性 - 临时表改进
  7. 10.1.5 布局优化利器之 Hierarchy Viewer
  8. java锁的种类以及辨析(转载)
  9. 删除条目时的确认对话框
  10. oracle 11g使用deferred_segment_creation 延迟段创建特性时遇到的问题总结