问题描述

  1. 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
  2. 例如,给出
  3. 前序遍历 preorder = [3,9,20,15,7]
  4. 中序遍历 inorder = [9,3,15,20,7]
  5. 返回如下的二叉树:
  6. 3
  7. / \
  8. 9 20
  9. / \
  10. 15 7
  11.  
  12. 限制:
  13. 0 <= 节点个数 <= 5000

代码

假设先序序列为\(pre_1,...,pre_n\),中序序列为\(in_1,...,in_n\),那么先序序列的第一个元素\(pre_1\)为当前二叉树根节点,由中序序列性质只该根节点将中序序列划分为左子树和右子树,因此要在中序序列中找到\(in_k=pre_1\),这时题目的元素是不重复的就起作用了。这样左子树个数为\(numLeft = k-1\),于是左子树的先序区间为\([pre_2,pre_k]\),右子树先序区间\([pre_{k+1},pre_n]\),左子树的中序区间为\([in_1,in_{k-1}]\),右子树的中序区间为\([in_{k+1},in_n]\).事实上,如果当前先序序列区间为\([prL,preR]\),中序序列区间为\([inL,inR]\),那么左子树节点个数为\(numLeft = k-inL\),这样左子树先序序列区间为\([preL+1,preL+numLeft]\),右子树先序序列区间为\([preL+numLeft+1,preR]\),左子树中序序列区间为\([inL,k-1]\),右子树中序序列区间为\([k+1,inR]\).只要先序序列的长度小于等于0,当前二叉树就不存在了。

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
  13. return build(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
  14. }
  15. TreeNode* build(vector<int>& preorder,int preL,int preR,vector<int> &inorder,int inL,int inR)
  16. {
  17. int k;
  18. if(preR-preL < 0)return NULL;//注意小于号
  19. TreeNode * node = new TreeNode(preorder[preL]);
  20. for( k = inL; k <= inR; ++k)//注意小于等于号
  21. if(inorder[k]==preorder[preL])
  22. break;
  23. int numLeft = k - inL;
  24. node->left = build(preorder,preL+1,preL+numLeft,inorder,inL,k-1);
  25. node->right = build(preorder,preL+numLeft+1,preR,inorder,k+1,inR);
  26. return node;
  27. }
  28. };

结果:

  1. 执行用时 :64 ms, 在所有 C++ 提交中击败了26.59%的用户
  2. 内存消耗 :25.4 MB, 在所有 C++ 提交中击败了100.00%的用户

《剑指offer》面试题07. 重建二叉树的更多相关文章

  1. 剑指offer面试题6 重建二叉树(c)

  2. 剑指offer面试题6 重建二叉树(java)

    注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...

  3. 剑指Offer:面试题6——重建二叉树(java实现)

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

  4. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  5. 剑指Offer - 九度1385 - 重建二叉树

    剑指Offer - 九度1385 - 重建二叉树2013-11-23 23:53 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的 ...

  6. 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)

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

  7. 剑指offer第二版-7.重建二叉树

    描述:输入某二叉树的前序遍历和中序遍历结果,重建该二叉树.假设前序遍历或中序遍历的结果中无重复的数字. 思路:前序遍历的第一个元素为根节点的值,据此将中序遍历数组拆分为左子树+root+右子树,前序遍 ...

  8. 剑指offer【04】- 重建二叉树(java)

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

  9. 剑指offer(4)重建二叉树

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

  10. 剑指offer——面试题8:二叉树的下一个节点

    // 面试题8:二叉树的下一个结点 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...

随机推荐

  1. 《Power Query数据清洗实战》捉虫……

    先道歉,<Power Query数据清洗实战>里,有虫-- 谢谢大家帮忙捉虫了. 谢谢法叔,他捉了四只--(汗) 112页第倒第二行,[追加查询],应是[合并查询]. 151.154.15 ...

  2. LuoguB2045 晶晶赴约会 题解

    Content 贝贝邀请晶晶下个星期 \(x\)(如果 \(x=7\) 表示星期日)一起去看展览,但是晶晶下个星期 \(1,3,5\) 都有课.请你判断晶晶能否同意贝贝的请求. 数据范围:\(x\in ...

  3. 你假笨JVM参数 - 1 CMSScavengeBeforeRemark

    参数:-XX:CMSScavengeBeforeRemark含义:Enable scavenging attempts before the CMS remark step.开启或关闭在CMS重新标记 ...

  4. JAVA通过经纬度获取两点之间的距离

    private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math ...

  5. C/C++ 基本类型 占字节

    下面给出不同位数编译器下的基本数据类型所占的字节数: 16位编译器 char :1个字节char*: 2个字节(即指针变量)short: 2个字节int:  2个字节unsigned int : 2个 ...

  6. c++之记一次常见数据类型在fedora和wind10下所占的长度

    包括: char , int , float, double, long ,long long , unsigned long long , long double 1.源码 #include < ...

  7. windows10使用VS(VC++)创建c++多进程命名管道通信

    代码可以在 这里 下载 代码主要涉及到: 管道通信 多线程(含临界区) 多进程通信 创建的子进程独立运行 更新日志: 04-12-2020 1. 去除自定义函数返回值,改为int作为函数返回值并增加相 ...

  8. 【LeetCode】497. Random Point in Non-overlapping Rectangles 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/random-p ...

  9. 1266 - Points in Rectangle

    1266 - Points in Rectangle    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...

  10. Spring MVC 文件上传、Restful、表单校验框架

    目录 文件上传 Restful Restful 简介 Rest 行为常用约定方式 Restful开发入门 表单校验框架 表单校验框架介绍 快速入门 多规则校验 嵌套校验 分组校验 综合案例 实用校验范 ...