【剑指offer】7、重建二叉树

题目

给出二叉树的前序遍历与中序遍历结果,重建该二叉树。

思路

由于前序遍历的第一个数字是根节点,将中序遍历分为左右子树两个部分。接下来就递归,将左子树和右子树的序列分离出来,然后调用递归函数。

TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
  int length = pre.size() - 1;
  TreeNode* root = ConstructCore(pre, 0, length , vin, 0, length);
  return root;
}

TreeNode* ConstructCore(vector<int> pre, int pre_start, int pre_end, vector<int> vin, int vin_start, int vin_end){
  if ((pre_start > pre_end) || (vin_start > vin_end))
    return nullptr;
  TreeNode* res = new TreeNode(pre[pre_start]);
  for (int i = vin_start; i <= vin_end; i++)
  {
    if (vin[i] == pre[pre_start]){
      res->left = ConstructCore(pre, pre_start + 1, pre_start + i - vin_start, vin, vin_start, i - 1);
      res->right = ConstructCore(pre, pre_start + i + 1 - vin_start, pre_end, vin, i + 1, vin_end);
    }
  }
  return res;
}

原文地址:https://www.cnblogs.com/shiganquan/p/9281782.html

时间: 2024-11-09 21:17:48

【剑指offer】7、重建二叉树的相关文章

剑指OFFER之重建二叉树(九度OJ1385)

题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序

剑指Offer:重建二叉树【7】

剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 分析 我们首先要明白前序和中序构建二叉树的流程,流程理解了才是解题的关键: 如上图所示,前序遍历可以找到头结点,然后在中序遍历中找到它的位置 比如,1的位置为i,那么startIn~i-1就是它的左子树的中序遍历,st

[剑指offer]8.重建二叉树

题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 代码 /*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 题目: 8.重建二叉树 * 结果:AC * 网址:http://www.nowcoder

【剑指offer】重建二叉树

题目:重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含童复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点. 二叉树结点的定义如下: struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; 创建根节点.前

剑指OFFER之重建二叉树

题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序

剑指offer试题——重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. # -*- coding:utf-8 -*- #定义了类,树节点,二叉树的节点,这里节点由三部分组成,值,左侧指针,右侧指针 # class TreeNode: # def __init__(self, x): # self.val = x # sel

剑指offer系列——重建二叉树

Q:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. C:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M A: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { if (pr

剑指offer[4]——重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 先序遍历是按照中--左--右的方式对二叉树进行遍历,由这种遍历方式我们可以很容易理解现需遍历的第一个数字是根节点的值. 比如说这个二叉树的线序遍历就是1-2-4-7-3-5-6-8,第一个数字就是根节点的值. 而中序遍历,顾名思义,就是按照左--中--

剑指offer:重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历的序列{4,7,2,1,5,3,8,6},则重建出下图所示的二叉树并输出它的头结点. 分析:前序遍历的第一个元素就是根节点的值 BinaryTreeNode* Construct(int* preorder, int* inorder, int length) { if(preorder == NULL || in

剑指offer 6 重建二叉树

不用迭代器的代码 class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { TreeNode* root = NULL; int length_pre = pre.size(); int length_vin = vin.size(); if(length_pre <= 0 || length_vin <= 0) return root; ret