剑指 Offer 07. 重建二叉树 - python

二叉树的前序遍历 二叉树的前序遍历的记忆法则是“根左右",即先遍历根节点,再遍历左子树节点,再遍历右子树节点。 以上图为例,前序遍历的结果是【A, B, D, E, C, F, G】 一、解题思路:递归 递归是我们实现前中后序遍历最常用的方法。 什么问题可以采用递归求解呢? 需要满足三个条件: 一个问题的解可以分解为若干个子问题的解; 这个问题与分解的子问题,除了数据规模不同外,求解思路相同 存在递归终止条件。 那么在知道一个问题可以采用递归实现之后,如何写出递归代码呢? 关键在于能写出递归公式,找到终止条件。 在. 阅读详情

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

 

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

思路:首先通过先序遍历序列可以得到树的根节点,然后在中序序列中找到根节点的位置,则以根节点为界限,向左到0,为左子树,向右到len() - 1 位右子树,然后得到的左右子树之后可以根据子树长度,在前序遍历中找到对应左右子树的边界,也就是能找到序列中对应左右子树的子序列。然后再对子序列进行上述操作,递归即可,终止条件为中序遍历序列中的左子树边界 >右子树边界。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        
        self.preorder = preorder
        self.dic = {inorder[i]: i for i in range(len(inorder))} #将中序遍历序列构造为hashmap,键为node.val值为对应索引
        return self.recur(0, 0, len(inorder) - 1)
    def recur(self, pre_root_idx, in_left_idx, in_right_idx):
        '''
        pre_root_idx:前序遍历中的根节点
        in_left_idx:中序遍历中的左子树边界
        in_right_idx:中序遍历中的右子树边界
        '''
        if in_left_idx > in_right_idx:
            return
        root = TreeNode(self.preorder[pre_root_idx])
        in_idx = self.dic[self.preorder[pre_root_idx]]

        root.left = self.recur(pre_root_idx + 1, in_left_idx, in_idx - 1)
        root.right = self.recur(in_idx - in_left_idx + pre_root_idx + 1, in_idx + 1, in_right_idx) 
        #in_idx - in_left_idx (左子树的长度) + pre_root_idx + 1 为右子树的根节点位置
        return root
        

 

一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归) 前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研、笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历。 这部分很多人可能会但是需要注重一下细节。 前面介绍了二叉排序树的构造和基本方法的实现,遍历也是比较重要的一环,并且二叉树的层序遍历也是bfs的最简单情况,这里我就将二叉树的层序遍历以及常考问题给大家分享一下。 在了解二叉树的遍历之前,需要具备数据结构与算法有队列、递归、栈、二叉树,这些内容咱们前面都有讲过,有这方面知识欠缺的同学可以 阅读详情

相关推荐

二叉树的遍历(七种方法)

本章主要通过运用递归与非递归方法分别对二叉树进行遍历 主要分先序遍历、中序遍历、后序遍历以及层次遍历四种情况进行讨论

AIGC 1万+

二叉树遍历方法——前、中、后序遍历(图解)

二叉树的前、中、后序遍历的递归与非递归算法

在夜里行走的博客 17万+

无人驾驶-2024-09-智能驾驶与机器视觉09:视觉与多传感器融合

从本章开始,我们将详细介绍视觉与多传感器融合技术。自动驾驶中常用的传感器都有其优势和局限性,单一传感器无法应对复杂的驾驶场景。多传感器融合技术旨在综合利用不同的传感器优势,提升感知的精度和鲁棒性。本章首先介绍多传感器融合的相关概念,之后详细介绍典型的融合方法。

u013250861的博客 593

剑指 Offer 07. 重建二叉树 Python

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制: 0 <= 节点个数 <= 5000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zho

朋克归零膏的博客 252

智能车竞赛蚂蚁搬家组:NXP-MicroPython与STC单片机协同搬运策略解析

本文深入解析智能车竞赛蚂蚁搬家组中NXP-MicroPython与STC单片机的协同搬运策略。通过硬件选型、通信架构设计、效率优化及实战经验分享,展示了如何利用NXP-MicroPython的实时控制与STC单片机的感知导航优势,实现高效多智能体协同作业,为参赛团队提供实用技术参考。

motor的博客 1080

BeckHoff <--> ABB 机器手 Profinet 通讯

本文介绍了BeckHoff PLC与ABB机器人通过PROFINET通信的实现方案。主要内容包括:1)通信接口的详细变量定义,涵盖输入/输出信号、设备状态监控、夹爪控制等关键功能位;2)全局数据结构和变量配置说明;3)机器人任务控制程序的实现方法,包括参数校验、任务指令下发和状态监控机制;4)重点分析了任务调度功能块的代码逻辑,涉及慢速模式处理、多参数配置和执行状态判断。该方案通过结构化变量定义和模块化程序设计,实现了PLC对机器人作业的精确控制,为工业自动化系统集成提供了可靠通信范例。

工控智联驿站 1032

剑指 Offer 07. 重建二叉树(python)

题目链接 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 解题思路: 1.找出前序的第一个元素,即为根节点,将该节点创建为一个树节点 2.找出该节点在中序中的索引root_index,中序中,该索引之前的即为左子树,之后的即为右子树 3.前序遍历中左子树的索引为1到中序遍历中根节点的位置,右子树的索引为

weixin_44740082的博客 401

surfer10与Arcgis10.3 完美生成等值线和等值面方法

surfer10 与Arcgis10.3生成等值线和等值面的步骤如下: 1.准备surfer用的Book1.dat文件,格式如下: "x" "y" "z" 116.471992 40.809975 232 116.335556 40.700542 1235 116.541626 40.713333 214 116.73349 40.798607 566 2.在surfer中,选择Gr

哈里·雪利博客 1万+

python剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder =[3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 解法一:递归法 二叉树的题目有固定章法可循。首先根据前序遍历找到根节点,然后根据该根节点在中序遍历中的位置找出左子树和右子数。随后返回到前序遍历中,继续找...

qq_33655102的博客 268

SAP PP模块 MRP配置实战:5步完成工厂级物料需求计划激活

本文详细介绍了SAP PP模块中物料需求计划(MRP)的工厂级配置实战,通过5个关键步骤从基础环境准备到最终激活。内容涵盖SPRO后台配置、MRP控制者定义、主数据设置及核心参数调整,帮助顾问快速掌握MRP配置清单的完整流程,确保物料需求计划的高效运行。

weixin_30431445的博客 342

INCA刷写App文件必看:A2l文件配置与ProF文件安装详解(2023最新版)

本文深入解析了使用INCA进行ECU应用程序刷写时,A2l文件配置与ProF文件安装的关键细节与避坑指南。重点阐述了A2l文件必须与待刷写二进制文件严格匹配的核心逻辑,以及ProF文件与Bootloader版本强相关的安装策略,帮助开发者解决刷写过程中的常见失败问题,确保刷写流程的稳定与可靠。

milk8的博客 591

剑指 Offer 07. 重建二叉树-Python题解

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 限制: 0 <= 节点个数 <= 5000 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # se

AiBigData的博客 4773

7、Python高光谱分析工具(PyHAT)简介

Python高光谱分析工具(PyHAT)是一个开源、跨平台的Python库及图形用户界面,用于行星光谱数据的可视化与分析。它支持多种高光谱传感器数据,如火星勘测轨道飞行器的CRISM、月船1号的M3以及SELENE Kaguya SP点光谱仪,提供预处理、衍生产品生成、统计学习和机器学习分析功能。PyHAT基于Pandas和NumPy构建,兼容Jupyter和QGIS环境,旨在解决现有光谱分析方法缺乏开源实现、难以探索性分析和算法分散的问题。其模块化架构涵盖数据输入/输出、通用光谱变换、测绘与点观测工具及高

aa123的博客 138

python练习之剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 限制: 0 <= 节点个数 <= 5000 来源:力扣(LeetCode) 分析 前序中序建树,递归老步骤:判断左右边界->赋值给根->找出中序中的根位置->左右递归-&gt

小楼一夜听春雨 385

提升YOLOv8检测精度的边界框损失函数Focaler-IoU与InnerFocalerIoU的应用与效果

YOLOv8是一种常用的实时目标检测模型,基于CNN(卷积神经网络)结构并结合了一些改进技术以提高检测精度和速度。YOLOv8的核心在于边界框的预测和分类,而准确的边界框预测是提高模型整体性能的关键因素之一。在传统的IoU损失基础上,Focaler-IoU和InnerFocalerIoU进一步聚焦于边界框的边缘区域,通过调整损失权重,更好地关注难以检测的边界框,提高模型的鲁棒性和准确性。# 计算IoU# 计算Focaler-IoU损失在这里,我们定义了。

博客 1340

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python:剑指 Offer 07. 重建二叉树

python:剑指 Offer 07. 重建二叉树 根据前序遍历和中序遍历 输出根节点 示例 输入: Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7] Input: preorder = [-1], inorder = [-1] Output: [-1] ...

m0_46465161的博客 203

怀旧版电脑GBC模拟器

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

剑指 Offer 07. 重建二叉树 python

题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 限制: 0 <= 节点个数 <= 5000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-s

sfgoidhodfgioji的博客 161

WINCC7.3破解文件

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LeetCode | 面试题07. 重建二叉树【剑指Offer】【Python】

LeetCode 面试题07. 重建二叉树【剑指Offer】【Medium】【Python】【二叉树】【递归】 问题 力扣 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: ...

Wonz 569

剑指offer leetcode python版 面试题07 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None #前序:根左右 #中序:左根右 python版 class Solutio

weixin_43501807的博客 210

剑指 Offer 07. 重建二叉树----c++/python

案例讲解: https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/submissions/ 算法思路: 我们用一个栈和一个指针辅助进行二叉树的构造。初始时栈中存放了根节点(前序遍历的第一个节点),指针指向中序遍历的第一个节点; 我们依次枚举前序遍历中除了第一个节点以外的每个节点。如果 index 恰好指向栈顶节点,那么我们不断地弹出栈顶节点并向右移动 index,并将当前节点作为最后一个弹出的节点的右儿子;如果 index 和栈顶节点不同,.

qq_36421001的博客 314

0216打卡作业【剑指offer】07.重建二叉树【python】

题目描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 题目链接 解题思路 思路一: 由于链表只能顺序索引,无法做到逆序索引。这个时候可以借用其他的数据结构来实现逆序,说到这里就想到了栈的先入后出功能。我们将数据放入栈中,即可实现逆序输出 时间复杂度:O(n),空间复杂度:O(n) 思路二: 不仅栈可以实...

weixin_43988882的博客 136

【Python】剑指 Offer 07. 重建二叉树【python中对二叉树的处理,切片操作】

描述 解析 这一题的关键是找到下标,然后执行递归操作 涉及到数组下标,可以采用列表的切片操作,同时index(()函数可用于获取列表对象的索引; 根据前序遍历,可以获取根节点下标,然后通过中序遍历判断左右子树的节点个数; 从而通过切片操作获取递归操作的前序遍历和中序遍历的序列,继续执行递归操作即可; 注意:切片操作,不包含右边索引的对象 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x):

qq_39457296的博客 266

剑指Offer07:重建二叉树(Golang/Python/C#)

剑指 Offer 07. 重建二叉树

水资源领域的程序猿 255

剑指 Offer 07. 重建二叉树(java+python)

java+python

江浸月的博客 115

Python刷leetcode--剑指 Offer 07.重建二叉树

树的问题需要多往递归上想。 然后中序遍历是三种遍历中最关键的遍历。 中序遍历找到先序遍历后 先序遍历之后的几个 = 中序遍历左边的几个 class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def buildTree(self, preorder, inorder): #

希望能解决大家的问题,也欢迎老哥们来骚扰技术交流业务中的问题 233
上一篇: 剑指 Offer 25. 合并两个排序的链表 - python
下一篇: leetcode 56. 合并区间 python
心之所向丶7
博客等级 码龄11年 17粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值