Construct Binary Tree from Preorder and Inorder Traversal

原题链接Construct Binary Tree from Preorder and Inorder Traversal

给定一个二叉树的先序遍历和中序遍历,要求重现这棵二叉树

另先序遍历的序列为preorder,中序遍历的序列为inorder,节点个数为n

根据先序遍历的特点,可知preorder[0]一定是整棵二叉树的根节点,那么,如果已确定根节点值在中序遍历序列inorder中的下标是i,就一定有

  • inorder[0 : i - 1]这些值属于根节点的左子树
  • inorder[i + 1, n - 1]这些值属于根节点的右子树

因为中序遍历是从最左边开始遍历,所以当遍历到根节点inorder[i]时,之前遍历到的节点一定都属于左子树

那么现在的目的就是如何确定左右子树的根节点,由先序遍历可知

  • preorder[0 + 1]一定是左子树的根节点
  • preorder[0 + 1 + (i - 0)]一定是右子树的根节点

因为先序遍历遍历到的节点顺序是从根节点到最左边,再到右边,那么既然已经直到左子树上有多少节点了(i - 0个),那么就可以确定右子树的根节点

直接递归即可

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return buildTree(0, 0, inorder.size() - 1, preorder, inorder);  }
private:/* preStart : 当前根节点在preorder中的下标* [inStart:inEnd]  : 以preorder[preStart]为根节点的子树的节点值在inorder的范围*/TreeNode* buildTree(int preStart, int inStart, int inEnd, vector<int>& preorder, vector<int>& inorder){if(preStart >= preorder.size() || inStart > inEnd)return nullptr;/* 申请根节点 */TreeNode* root = new TreeNode(preorder[preStart]);/* 寻找根节点在inorder的位置,拆分左右子树 */int inIndex = 0;for(int i = inStart; i <= inEnd; ++i){if(inorder[i] == preorder[preStart]){inIndex = i;break;}}root->left = buildTree(preStart + 1, inStart, inIndex - 1, preorder, inorder);root->right = buildTree(preStart + 1 + inIndex - inStart, inIndex + 1, inEnd, preorder, inorder);return root;}
};

本题主要需要弄清楚如何进行递归,当然拆分成左右子树是个很好的方法,不够不太容易想到。

先序遍历可以直到根节点,而中序遍历可以确定该根节点的左右子树的取值范围,从而不断拆分下去,最终求解

每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树相关推荐

  1. 【LeetCode】105#从前序与中序遍历序列构造二叉树

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...

  2. pat根据中序遍历和先序遍历_[leetcode/lintcode 题解] 前序遍历和中序遍历树构造二叉树...

    [题目描述] 根据前序遍历和中序遍历树构造二叉树. 在线评测地址: 九章算法 - 帮助更多中国人找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧​www.jiuzhang.com [样例 ...

  3. python实现二叉树的重建1 之由前序遍历和中序遍历重建

    前言 此题是关于树的面试题目的常见题型,题目的含义很清晰,这个就不用多说了 解法 关于这道题的解法有很多不同的样式,通用的解法是这样的: 假如现在我们有如下两个遍历的情况 preorder: [1, ...

  4. PAT甲级1138 Postorder Traversal:[C++题解]前序遍历和中序遍历建树

    文章目录 题目分析 题目链接 题目分析 做过前面几道题,发现这道题就是一道模板题,递归建树即可. 还是使用笔者熟悉的hash表来找根,进行优化. 请移步至笔者的另一篇文章:PAT甲级1020 Tree ...

  5. 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历

    二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...

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

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

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

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

  8. python根据二叉树的前序遍历和中序遍结果历重建二叉树

    python根据二叉树的前序遍历和中序遍结果历重建二叉树 前序遍历 对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子.以上图为例,递归的过程如下: (1):输出 1,接着左孩子: ( ...

  9. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)

    python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...

最新文章

  1. 适用于CUDA GPU的Numba例子
  2. PHP - 如何实现跨域
  3. Python字符串方法:字符串拼接、截取、转数字
  4. 20145233《Java程序设计》课程总结
  5. [POI2007]ZAP-Queries [HAOI2011]Problem b 莫比乌斯反演
  6. 计算机网络:05---网络类型:局域网、城域网、广域网、个域网、无线网络
  7. Spring的WebClient基本使用
  8. 软件质量保证计划_CMMI V2.0 精讲之“过程质量保证”
  9. 混乱开发,既伤身体又伤感情
  10. Python求数独的补充
  11. Android RxJava2 浅析
  12. postgresql搭建从库
  13. Request和Response的概述及其方法
  14. 摄像头poe供电原理_带你简单了解一下什么是POE供电
  15. 调用Java API发送传真
  16. 【Java基础】· 集合习题详解
  17. Cocos2d-x 游戏实例教程跑跑跑2:让主角动起来
  18. 看到这4种奇葩面试方法的公司,转身就走吧!
  19. SQL根据一张表数据更新另外一张表
  20. 蜘蛛侠:迈尔斯·莫拉莱斯 实机演示截图及游戏下载

热门文章

  1. python中image.open函数怎么用_详解Python中open()函数指定文件打开方式的用法
  2. Java黑皮书课后题第7章:**7.17(对学生排序)编写一个程序,提示用户输入学生个数、学生姓名和他们的成绩,然后按照学生成绩的降序打印学生的姓名。假定姓名是不包含空格的字符,使用next()读取
  3. Java黑皮书课后题第3章:*3.30(当前时间)修改编程练习题2.8,以12小时时钟制显示小时数
  4. 区块链应用落地的6大挑战
  5. Android动态权限申请
  6. [转载]线上应用故障排查之一:高CPU占用
  7. 2018上IEC计算机高级语言(C)作业 第2次作业
  8. Vue(二十一)使用express模拟接口数据
  9. 异步提交表单插件jquery.form.min.js的使用实例
  10. (四)C语言柔性数组、指针赋值