剑指offer-刷题笔记-中难题-JZ7 重建二叉树

Vector(向量容器) Vector是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。 一、在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即capacity ()函数的返回值。当存储的数据超过分配的空间时vector 会重新 阅读详情

剑指offer-刷题笔记-中难题-JZ7 重建二叉树

注意:通过先序遍历和中序遍历可以确定二叉树, 通过中序遍历和后续遍历可以唯一确定二叉树,通过先序遍历和后序遍历确定不了二叉树。

1.通过先序遍历和中序遍历可以确定二叉树

算法:

1.通过先序遍历找到根节点A,再通过根节点在中序遍历的位置找出左子树,右子树
2.在A的左子树中,找出左子树的根节点(先序遍历),递归进入1
3.在A的右子树中,找出右子树的根节点(先序遍历),递归进入1

输入输出

/**
 * 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) {
        int n = pre.size();
        int m = vin.size();
        //两个遍历都不能为0
        if(n==0||m==0)
        {
            return nullptr; 
        }
        //构建根节点
        TreeNode *root = new TreeNode(pre[0]);
        for(int i = 0;i<vin.size();i++)
        {
            //找到中序遍历中的前序第一个元素
            if(pre[0] == vin[i])
            {
                //输入pre{1,2,4,7,3,5,6,8},vin{4,7,2,1,5,3,8,6}
                //满足条件i=3, 左子树前序遍历{2,4,7},
                //左子树的前序遍历
                vector<int> leftpre(pre.begin() + 1, pre.begin() + i + 1);//注意尾指针指到后面一个
                //左子树的中序遍历
                vector<int> leftvin(vin.begin(),vin.begin()+i);
                //构建左子树
                root->left = reConstructBinaryTree(leftpre,leftvin);
                //右子树的前序遍历
                vector<int> rightpre(pre.begin()+i+1, pre.end());
                //右子树的中序遍历
                vector<int> rightvin(vin.begin()+i+1,vin.end());
                root->right = reConstructBinaryTree(rightpre, rightvin);
                break;
            }
        }   
        return root; 
    }
};

2.通过中序遍历和后序遍历可以确定二叉树

算法:

1.通过后序遍历找到根节点A,再通过根节点在中序遍历的位置找出左子树,右子树
2.在A的左子树中,找出左子树的根节点(后序遍历),递归进入1
3.在A的右子树中,找出右子树的根节点(后序遍历),递归进入1

输入输出

class Solution {
public:
    
    TreeNode* reConstructBinaryTree(vector<int> post,vector<int> vin) {
        int n = post.size();
        int m = vin.size();
        //两个遍历都不能为0
        if(n==0||m==0)
        {
            return nullptr; 
        }
        //构建根节点
        TreeNode *root = new TreeNode(post[post.size()-1]);
        for(int i = 0;i<vin.size();i++)
        {
            //找到中序遍历中的后序最后一个元素
            if(post[post.size()-1] == vin[i])
            {
                //输入post{7,4,2,5,8,6,3,1},vin{4,7,2,1,5,3,8,6}
                //满足条件i=3, 左子树后序遍历{7,4,2},
                //左子树的后序遍历
                vector<int> leftpost(post.begin(), post.begin() + i);//注意尾指针指到后面一个
                //左子树的中序遍历
                vector<int> leftvin(vin.begin(),vin.begin()+i);
                //构建左子树,
                root->left = reConstructBinaryTree(leftpost,leftvin);
                //右子树的后序遍历
                vector<int> rightpost(post.begin()+i, post.end()-1);
                //右子树的中序遍历
                vector<int> rightvin(vin.begin()+i+1,vin.end());
                root->right = reConstructBinaryTree(rightpost, rightvin);
                break;
            }
        }   
        return root; 
    }
};
剑指offer所有编程练习总结分析 给出剑指offer所有题目描述和对应的解题思路,并且在最有给出对应的代码展示和测试内容 由于牛客剑指Offer题目经过整理和筛选,是面试备考的经典资源之一,因此它的重要性在面试准备过程中是很高的。做这些题目可以帮助面试者熟悉常见的面试题型、巩固基础知识、提升编程能力,为应对面试提供了很好的准备。然而,还需注意不仅仅局限于做题,理解背后的原理和思想同样重要,以便能够在面试时灵活运用和展示自己的能力。 阅读详情

相关推荐

牛客网剑指offer专题python解答JZ1---JZ12持续刷题中

文章目录JZ1二维数组中的查找JZ2 替换空格描述示例1JZ3 从尾到头打印链表描述示例1示例2JZ4 重建二叉树描述示例1示例2示例3JZ5 用两个栈实现队列描述示例1JZ6 旋转数组的最小数字描述示例1JZ7 斐波那契数列描述示例1JZ8 跳台阶描述示例1示例2JZ9 跳台阶扩展问题描述示例1JZ10 矩形覆盖描述输入描述:返回值描述:示例1示例2示例3JZ11 二进制中1的个数描述示例1JZ12 数值的整数次方描述示例1示例2示例3 JZ1二维数组中的查找 给定一个二维数组,其每一行从左到右递增排序,

李波的blog,一名喜欢编程和分享技术的研究僧~ 806

剑指offer7:重建二叉树

树的遍历

weixin_46266058的博客 280

VLSI数字信号处理系统——第九章滤波器和变换中的算法强度缩减

[课程学习] VLSI数字信号处理系统——第九章滤波器和变换中的算法强度缩减

夏风喃喃的博客 1604

【C++】vector的常见用法

public :};//向容器中添加数据 v . push_back(p1);//遍历容器中的数据 for(vector < Person > :: iterator it = v . begin();it!it ++) {cout

PuddleRubbish的博客 588

system_stm32f10x.c文件分析

配置系统时钟(包括系统时钟源、锁相环(PLL)倍频系数、高级高性能总线(AHB)/ 高级外设总线(APBx)预分频器以及闪存相关设置)。该函数在系统复位后的启动阶段被调用,且调用时机早于跳转到主程序之前。

Jia shuheng的博客 602

ROS2学习笔记(二)-- 多机通讯原理简介及配置方法

简单介绍ROS2多机通信原理以及配置注意事项

aibingjin的博客 1万+

剑指offer - 04重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路如下: 1. 前序遍历的第一个节点是根节点 2. 用根节点在中序遍历序列中查找, 则根节点左边的节点 都是根节点左子树的节点 右边的节点都是根节点右子树...

k117470154的博客 175

【tensorrt】——深入解析TypeError: pybind11::init()报错:CUDA版本冲突与解决方案

本文深入解析了TensorRT中常见的TypeError: pybind11::init()报错问题,重点探讨了CUDA版本冲突的根源与解决方案。通过实际案例展示了PyTorch与TensorRT的版本兼容性问题诊断方法,并提供了conda环境管理、环境变量配置等实用修复技巧,帮助开发者有效解决CUDA初始化失败问题。

ggg99的专栏 271

JZ7 重建二叉树

数据范围:n≤2000n \le 2000n≤2000,节点的值 −10000≤val≤10000-10000 \le val \le 10000−10000≤val≤10000。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。要求:空间复杂度 O(n)O(n)O(n),时间复杂度 O(n)O(n)O(n)//左子树的前序遍历。//左子树的中序遍历。//右子树的前序遍历。//右子树的中序遍历。//遍历输入的中序数组。

qq_52908992的博客 158

一觉醒后ChatGPT 被淘汰了

近日,AI 界貌似出现了一种新的趋势:自主人工智能。这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉前 AI 总监、刚刚回归 OpenAI 的 Andrej Karpathy 也为其大力宣传,并在推特赞扬:「AutoGPT 是 prompt 工程的下一个前沿。」

Rocky006的博客 13万+

高通9008模式隐藏技巧:不拆机用ADB命令+Diag协议进入EDL

本文深入解析高通EDL模式(紧急下载模式)的技术原理与实战应用,详细介绍了通过ADB命令和Diag协议无需拆机进入EDL的方法。涵盖硬件/软件触发方案、跨平台工具配置、Firehose协议解析及设备救砖流程,为开发者提供从基础到进阶的完整指南。

weixin_29191761的博客 1123

《剑指offer》刷题记录汇总篇

《剑指offer》刷题汇总1 前言2 刷题网站3 刷题笔记汇总 1 前言   最近啃了个把月的数据结构与算法,有点飘了,准备拿牛客网的剑指offer模块练练手,个人觉得自己刚入门(或许还没入),所以这篇博客比较适合想学习数据结构或者刚接触数据机构的新手朋友朋友们,当然,大佬们也可以看看,一是指导,二是差缺补漏。   刷题顺序即题目顺序,时间的话大概一周 2 刷题网站 点击直达:剑指offer 3 刷题笔记汇总 题号 题目 知识点 JZ1 二维数组中的查找 数组、查找 JZ2 替换空格 字

郑德帅 864

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

Systemcall名屋 1685

LeetCode刷题总结 - 剑指offer系列 - 持续更新

LeetCode刷题总结

qq_45464560的博客 5241

第一章:信号链的精度之战:深入解决电流采样偏差

摘要:本文深入探讨了FOC控制中电流采样偏差问题及其解决方案。电流采样偏差主要来源于偏移误差、增益误差、非线性误差和温漂四大类,其中偏移误差对FOC性能影响最为严重。硬件方面建议采用高精度采样电阻、低失调运放和独立基准电压等设计;软件层面提出了上电自动零点校准、在线实时补偿和模型闭环补偿三种策略。最后介绍了量产自动化校准系统,通过硬件优化和软件补偿相结合,确保每台产品电流采样精度的一致性,为FOC控制奠定坚实基础。

汽车软件开发 602

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

剑指offer JZ7 重建二叉树

接着就可以递归构建二叉树的左子树和右子树了,通过dfs函数递归构建,dfs(i, j, n) 表示以从前序遍历第i个节点开始的n个节点以及对应的中序遍历中第j个节点开始的n个节点,构建出的包含n个节点的二叉树,递归构建左子树dfs(i + 1, j, k - j),递归构建右子树dfs(i + k - j + 1, k + 1, n - (k - j) - 1)。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。

qq_74980411的博客 338

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【剑指offer刷题】JZ4:给定二叉树的前序遍历和中序遍历,重建二叉树

转载请注明出处:https://blog.csdn.net/loiter2/article/details/107523272 【剑指offer刷题】JZ4:给定二叉树的前序遍历和中序遍历,重建二叉树1、题目分析2、代码实现 该文章只是用来记录一下刷题过程,本文的记录和解答用的Java语言。 1、题目分析 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3

Spikeloiter的博客 423

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

剑指offer刷题总记——Java

剑指offerJZ1 二维数组中的查找JZ2 替换空格JZ3 从尾到头打印链表JZ7 斐波那契数列JZ14 链表中倒数第k个节点JZ15 反转链表JZ36 两个链表的第一个公共结点 JZ1 二维数组中的查找 题目:二维数组中的查找 public class Solution { //双重for循环,遍历查找 public boolean Find(int target, int [][] array) { //行遍历,array.length为行数 for(i

小叮当不懒的博客 742

(最新版2022版)剑指offer之树和二叉树题解

(最新版2022版)剑指offer之树和二叉树题解

weixin_51405802的博客 1455

剑指offer

​一刷 剑指offer 记录

dwtianwen的博客 1104

【剑指Offer刷题】JZ7 重建二叉树(中等)

给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。前序遍历的特点:先访问根节点,再访问左子树,左子树返回后再访问右子树。也就是,知道根节点、左子树、右子树其中任意一个在数组中的位置和长度后,便可以确认其序号。中序遍历的特点:先访问左子树,再访问根节点,最后访问右子树。n ≤ 2000,节点的值 −10000 ≤ val ≤ 10000。

Xiaolan_2001的博客 299

牛客网-剑指Offer刷题记录

emmm 赶在初一这天晚上终于把剑指Offer刷了一遍了,记录一下Coding的代码,希望接下来找工作顺利,上天保佑我; 牛客网剑指Offer67题 剑指Offer题记 JZ1 //从左上角开始找 public class Solution { public int JumpFloorII(int target) { if(target == 1 || target == 0) return 1; int[] res = new int[target+1];

hello 568

剑指offer打卡 JZ7 重建二叉树

在牛客网刷的,还是跟leetcode一样非acm模式,由于急着暑期实习题量不固定,八股算法轮刷打卡内容偏个人笔记,本人水平一般(代码随想录稀里糊涂刷了一遍),从小白开始分析(甚至会分析语法),尽量一题多解深入探究(一般ac后看看前三个题解发散下思维),希望能对你有帮助。

cangshanjiang的博客 645

JZ4 ~JZ10 剑指offer 习题4至习题10

大题目前言一、第一章二、第二章1.大标题12.大标题22.1 小标题12.2 小标题2三、总结 前言 内容总概述 提示:以下是本篇文章正文内容,下面案例可供参考 一、第一章 问题描述 二、第二章 1.大标题1 第一段 //代码粘贴处 2.大标题2 2.1 小标题1 代码如下(示例): //代码粘贴处    2.2 小标题2 代码如下(示例): //代码粘贴处    三、总结 总结与结果展示 ...

weixin_42269028的博客 1032

【剑指offer】剑指刷题记录(记录所刷题目的通过代码)

写在前面 此博客记录自己在剑指的刷题过程中所有通过的代码,目的在于监督自己每天刷题。持续刷题,持续更新。每天都要记得好好刷题鸭! 通过的代码记录 (1)JZ2 替换空格 这里是考察的字符数组的用法吧,我用了string,网上通用的解法没有引入string。 class Solution { public: void replaceSpace(char *str,int length) { string ans=""; char* str2; for(int

qq_38391210的博客 222

牛客网剑指Offer-树篇-JZ7 重建二叉树

给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。

技术卷的博客 481
上一篇: 剑指offer-刷题笔记-简单题-JZ44 数字序列中某一位的数字
下一篇: 剑指offer-刷题笔记-中等题-JZ14 剪绳子
xiaoliyu00
博客等级 码龄9年 4180粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值