1 基本思路:前序遍历的第一个节点为根节点,找到根节点在中序遍历中的位置i。然后分别找到前序遍历中左子树对应的部分,前序遍历中右子树对应的部分,中序遍历中左子树对应的部分,中序遍历中右子树对应的部分,分别用四个数组来存储。然后分别对左子树、右子树递归调用,传入的参数也对应发生改变。
2 代码实现:

/*** Definition for binary tree* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* reConstructBinaryTree(vector<int>pre,vector<int>in) {//考虑边界情况:由于pre和in的size总是相同int inlen=in.size();if(inlen==0)return NULL;//先序遍历序列的首元素是根节点TreeNode * head=new TreeNode(pre[0]);//查找根节点在中序遍历序列中的位置,pos用来存储这个位置int pos=find(in.begin(),in.end(),pre[0])-in.begin();  //用left_pre存储前序序列中的左子树,left_in存储中序序列中的左子树//用right_pre存储前序序列中的右子树,right_in存储中序序列中的右子树vector <int> left_pre,left_in,right_pre,right_in;for(int i=0;i<pos;i++){left_in.push_back(in[i]);left_pre.push_back(pre[i+1]);}for(int i=pos+1;i<inlen;i++){right_in.push_back(in[i]);right_pre.push_back(pre[i]);}//将左子树的前序中序序列传入,递归构建左子树head->left=reConstructBinaryTree(left_pre,left_in);head->right=reConstructBinaryTree(right_pre,right_in);//每次递归调用返回根节点return head;}
};

3 注意事项:
①需要考虑边界情况,即当左子树序列或者右子树序列元素的个数为0的时候,返回值为空
②使用find()-in.begin()获取根元素在中序序列的位置,因为find()的返回值和begin()是同种类型,所以可以做运算。
③前序序列和中序序列分别对应的左子树和右子树的范围及更新是递归的前提
④每次递归调用都返回当前树的根节点。
4 语法收获:
①可以对vector的begin()和end()取内容(*)获得数组的首尾元素,注意end需要减1
②查找数组中是否有值为XX的元素并返回其下标
int i=find(a.begin(),a.end(),val)-a.begin()
使用find时添加头文件algorithm
find返回值是vector对应的迭代器类型,与begin()返回值类型相同,所以可以做运算
③ vector类型的好处是既可以通过指针访问,也可以通过下标访问
④不管是链表的节点还是树的节点,都可以在结构体内加一个构造函数,方便创建节点的时候直接初始化。
例如:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
构造函数中使用参数列表初始化成员,注意参数列表的基本格式。
5 报错记录
编译报错:too few arguments to function call,expected 6,have 2
报错原因:形参和实参个数不符 收获:牛客网剑指offer的题目要严格按照它的定义来,因为是按照它的定义来测试用例的,如果修改,用例会因为参数传递不通过。

根据前序序列和中序序列重建二叉树相关推荐

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

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

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

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

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

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

  4. 树与二叉树——由前序序列和中序序列确定一刻二叉树

    确定一棵二叉树的方法可以使用扩展二叉树来构建以可二叉树,也可以通过由前序序列和中序序列或者由前序序列和后序序列来确定一棵二叉树. 例如由前序序列和中序序列来确定一棵二叉树,这里用到的方法是利用递归算法 ...

  5. 由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)

    下面三种序列可以唯一的构造唯一的一棵二叉树: 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #inc ...

  6. 由前序序列与中序序列实现后序遍历

    二叉树是一种特殊的树,二叉树只有两个分支,分别是该节点的左儿子和右儿子. 前序遍历:就是先遍历根节点,然后再访问左子树与右子树.遍历子树的时候同样也是先遍历根节点然后在遍历他的左子树与右子树. 中序遍 ...

  7. 二叉树的建立(已知前序序列和中序序列)

    已知二叉树前序序列和中序序列递归创建二叉树 #include<bits/stdc++.h> using namespace std; typedef struct Node{char da ...

  8. 二叉树 | 根据前序中序遍历重建二叉树

    Thinking 如果给你一颗二叉树的前序序列和中序序列,让你输出它的后序序列,你会怎么做呢? 也许很多同学能够很快的在纸上将一颗简单的二叉树画出来,但如果真正让你将自己的思路转换为算法,你会去怎样实 ...

  9. 已知二叉树先序序列和中序序列,求后序序列

    回答了百度知道上的一个提问,原题是这样的: 当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDHFAC时,其后序序列为什么?当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDH ...

  10. 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)

    7-10 先序序列创建二叉树,输出先序序列.中序序列.后序序列并输出叶子结点数 (10 分) 对于给定的二叉树,输出其先序序列.中序序列.后序序列并输出叶子结点数. 输入格式: 二叉树的先序遍历序列. ...

最新文章

  1. 可以由指令直接指定的I/O端口数(一共256个,从0到255一共256个端口号)
  2. 神经网络的分类准确率是连续的吗?
  3. Redis-04Redis数据结构--哈希hash
  4. 解决NTKO Office中文文件名保存到服务器时出现乱码的问题
  5. Linux 变量和结构体
  6. Python批量下载电子邮件附件并汇总合并Excel文件
  7. oracle 返回list,myabatis oracle 调用存储过程返回list结果集
  8. uCharts图表在小程序中的使用
  9. AppTheme属性设置集合
  10. [转]Linux统计代码行数
  11. Google验证码ReCaptcha V3
  12. c# 串口 多线程_远距离无线串口模块手持平板电脑价格多少钱
  13. qgis导出shp_使用QGIS将文本坐标转换为矢量文件
  14. 尚学堂马士兵struts2操作手册
  15. ad20如何画出pcb板大小_如何用AD更改PCB板子尺寸
  16. [数据分析笔记] 网易云歌单分析系列01—爬取网易云歌单信息
  17. 塔防三国志服务器维护时间,塔防三国志中期玩家教程攻略详解
  18. Windows Media Player Network Sharing Service 启动失败
  19. iPhone X 界面设计尺寸和适配【完整版】
  20. kernel exploit 有用的结构体

热门文章

  1. html的日期插件标签,CaretTab - 新式可以显示时间和日期的标签
  2. 征途2经典版服务器双线哪个稳定,《征途2》11月14日全区服务器版本更新公告
  3. MySQL函数批量建库、建表、加字段
  4. 怎样任意裁剪图片?如何快速改变图片形状?
  5. 解决npm install xxx -g问题
  6. Https 证书相关
  7. 滑动窗口(java)
  8. MAYA安装未完成,某些产品无法安装的解决方法
  9. Android Bugs——Error:java.lang.RuntimeException: Some file crunching failed, see logs for details
  10. 16位微型计算机 下册,十六位微型计算机