题目描述

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

本题采用递归思路求解

递归思路:如果遍历序列为空,返回空;在中序遍历中找到前序遍历的第一个元素(即根节点),找到根节点后记录根节点左子树的前序遍历和中序遍历,记录根节点右子树的中序遍历,把得到的相对应的前序遍历和中序遍历重复上面的过程即可。代码如下,仅供参考。

/**
* 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> vin) {
if(pre.size()==0||vin.size()==0){ //递归跳出条件
return NULL;
}
TreeNode *root = new TreeNode(pre[0]);
int i;
for(i=0;i<vin.size()&&vin[i]!=pre[0];i++); //找到根节点对应的元素值索引
vector<int> pre_left,pre_right,vin_left,vin_right;
int pre_i = 1; //标记pre容器的下表,根节点索引为0,所以从1开始,把pre容器分成两个容器
for(int j=0;j<vin.size();j++){
if(j<i){
vin_left.push_back(vin[j]);
pre_left.push_back(pre[pre_i]);
pre_i++;
}else if(j>i){
vin_right.push_back(vin[j]);
pre_right.push_back(pre[pre_i]);
pre_i++;
}
}
root->left = reConstructBinaryTree(pre_left,vin_left);
root->right = reConstructBinaryTree(pre_right,vin_right);
return root;
}
};

最新文章

  1. C和指针 第十一章 习题
  2. java4
  3. 突袭HTML5之WebGL 3D概述
  4. [mysql]throw exception
  5. 大叔也说Xamarin~Android篇~环境部署与破解
  6. iOS - 沙盒机制
  7. iOS10-配置获取隐私数据权限声明
  8. STM8S 独立看门狗配置及使用
  9. RPM包查询
  10. 黄文俊:Serverless小程序后端技术分享
  11. jacoco覆盖率工具测试及性能分析
  12. pm2管理node
  13. Git Base For Linux
  14. 启动MySQL报错
  15. RMQ算法详解
  16. django做redis缓存
  17. Retrofit添加自定义转换器
  18. VS Code使用Git管理代码
  19. 回调(CallBack)
  20. Alpha 冲刺报告(2/10)

热门文章

  1. Vue + d3.js实现在地图上选点
  2. 微信小程序 —搜索框
  3. 黑猫关键词URL采集工具 Pro v1.0
  4. 移植seetafaceengine-master、opencv到ARM板
  5. JWT验证机制【Python版Flask或自己写的后端可以用】【刘新宇】
  6. 借助leetcode题目来了解BFS和DFS
  7. go获取当前项目下所有依赖包
  8. 面试官:你对Redis缓存了解吗?面对这11道面试题你是否有很多问号?
  9. Windows API Index
  10. java关于throw Exception的一个小秘密