【剑指offer 07】用迭代和递归两种方法重构二叉树(python实现)

人人网2015研发笔试题解析:数据结构与算法核心考点复盘 技术面试中,数据结构与算法始终是衡量开发者基础能力的重要标尺。从链表操作到二叉树遍历,从时间复杂度分析到进程间通信,这些看似分散的知识点共同构成了计算机科学的底层逻辑。理解它们的原理,不仅能帮助应对笔试中的各类编程题,更能在实际工程中优化系统性能。例如,掌握LRU缓存策略和数据库索引结构,可以显著提升高并发场景下的响应速度;熟悉TCP协议状态变化,则有助于排查网络故障。无论是准备大厂研发岗的笔试题,还是提升日常编码能力,回归基础、吃透经典题型都至关重要。本文以人人网2015年研发笔试卷A为样本,逐题拆解其中 阅读详情

本文讲解一个经典的面试题,使用 python 通过迭代和递归两种方法重构二叉树。

题目描述

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

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

	3
   / \
  9  20
    /  \
   15   7

限制:0 <= 节点个数 <= 5000。

递归方法

二叉树的前序遍历顺序是:根节点、左子树、右子树,每个子树的遍历顺序同样满足前序遍历顺序。

二叉树的中序遍历顺序是:左子树、根节点、右子树,每个子树的遍历顺序同样满足中序遍历顺序。

前序遍历的第一个节点是根节点,只要找到根节点在中序遍历中的位置,在根节点之前被访问的节点都位于左子树,在根节点之后被访问的节点都位于右子树,由此可知左子树和右子树分别有多少个节点。

由于树中的节点数量与遍历方式无关,通过中序遍历得知左子树和右子树的节点数量之后,可以根据节点数量得到前序遍历中的左子树和右子树的分界,因此可以进一步得到左子树和右子树各自的前序遍历和中序遍历,可以通过递归的方式,重建左子树和右子树,然后重建整个二叉树。

递归方法的基准情形有两个:判断前序遍历的下标范围的开始和结束,若开始大于结束,则当前的二叉树中没有节点,返回空值 null。若开始等于结束,则当前的二叉树中恰好有一个节点,根据节点值创建该节点作为根节点并返回。若开始小于结束,则当前的二叉树中有多个节点。在中序遍历中得到根节点的位置,从而得到左子树和右子树各自的下标范围和节点数量,知道节点数量后,在前序遍历中即可得到左子树和右子树各自的下标范围,然后递归重建左子树和右子树,并将左右子树的根节点分别作为当前根节点的左右子节点。

展开来说,以下面的图为例子:

在这里插入图片描述

根据前序遍历得知,3 是根节点。

根据中序遍历得知,9 是左子树且节点数为1,[15, 20, 7] 是右子树且节点数为3。

根据上一步得到的左子树右子树节点个数,可以将前序遍历划分为左子树、右子树。

前序遍历中左子树的节点包含 [9] ,于是 9 就是左子树根节点。另外,还可以知道左子树在前序遍历中的左右边界为 [1, 1],由于左右边界相同,说明当前的左子树其实是叶节点,续划分左子树右子树的话,应该返回None。

前序遍历中右子树的节点包含 [20, 15, 7] ,于是 20 是右子树根节点。另外,右子树在前序遍历中的边界为 [2, 4],左右边界不相同,需要以20作为根节点继续划分子树。如下图所示:

在这里插入图片描述

在中序遍历中发现 20 的左子树有一个节点,右子树有一个节点,因此在前序遍历中可以确定 [15] 为左子树,[7] 为右子树。由于 20 的左右子树在前序遍历中边界相同,所以是叶节点,树构建完毕。

根据上面的理论,可以得到下面的代码实现:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    # 递归(1) 56 ms
    def buildTree(self, preorder, inorder):
        # 将前序遍历序列保存为属性,方便递归时得到 val
        self.po = preorder
        # 构造一个字典,方便确定边界
        self.dic = {}
        for i in range(len(inorder)):
            self.dic[inorder[i]] = i
        # 开始递归构造树
        return self.recur(0, 0, len(inorder)-1)

    def recur(self, pre_root, in_left, in_right):
        # 由于叶子节点没有左右子树,弱继续划分则应该得到None
        # 因此,当左边界大于右边界时结束递归
        if in_left > in_right:
            return 
        # 根据根节点的位置得到 val
        node = self.po[pre_root]
        # 构造根节点
        root = TreeNode(node)
        # 得到根节点的 val 在中序遍历序列中的位置
        i = self.dic[node]
        # 构造左子树
        # 左子树根节点为前序遍历序列根节点右边第一个元素
        # 右边界为中序遍历根节点位置左边的一个位置
        root.left = self.recur(pre_root+1, in_left, i-1)
        # 构造右子树
        # (i-in_left) 表示左子树节点的个数
        # 右子树根节点为前序遍历序列根节点右边第(i-in_left)+1个元素
        # 左边界为中序遍历根节点位置右边的一个位置
        root.right = self.recur(pre_root+(i-in_left)+1, i+1, in_right)
        return root
        
        
t = Solution().buildTree([3,9,20,15,7], [9,3,15,20,7])
print(t.val, t.left.val, t.right.val)

时间复杂度 O(N): N 为树的节点数量。初始化 HashMap 需遍历 inorder ,占用 O(N) ;递归共建立 N 个节点,每层递归中的节点建立、搜索操作占用 O(1),因此递归占用 O(N)。(最差情况为所有子树只有左节点,树退化为链表,此时递归深度 O(N) ;平均情况下递归深度 O( l o g 2 N log_2 N log2​N)。

空间复杂度 O(N): HashMap 使用 O(N) 额外空间;递归操作中系统需使用 O(N) 额外空间。

基于递归的思想,还有一种写法:

class Solution:
    # 递归(2) 192 ms
    def buildTree(self, preorder, inorder):
        if not preorder:
            return None
        loc = inorder.index(preorder[0])
        root = TreeNode(preorder[0])
        root.left = self.buildTree(preorder[1 : loc + 1], inorder[ : loc])
        root.right = self.buildTree(preorder[loc+1 : ], inorder[loc+1: ])
        return root

这样的写法更多的使用了python内置的方法,看起来十分简洁,就是执行时间长了一些。

迭代方法

例如要重建的是如下二叉树:

        3
       / \
      9  20
     /  /  \
    8  15   7
   / \
  5  10
 /
4

其前序遍历和中序遍历如下:

preorder = [3,9,8,5,4,10,20,15,7]
inorder = [4,5,8,10,9,3,15,20,7]

解题步骤:

  • 使用前序遍历的第一个元素(例如 3)创建根节点。
  • 创建一个栈,将根节点 (例如 3) 压入栈内,接下来准备一路向左构建左子树。
  • 初始化中序遍历下标为 0。
  • 遍历 preorder 中还未访问过的每个元素(例如 [9,8,5,4,10,20,15,7]),判断栈顶元素是否等于中序遍历下标指向的元素 (例如 4) 。
  • 若栈顶元素不等于中序遍历下标指向的元素 (例如 4) ,说明当前的 preorder 元素还没到达树的最左端,则将当前元素 (例如 9) 作为其上一个元素(例如栈顶元素 3)的左子节点,并将当前元素 (例如 9) 压入栈内,继续对 preorder 中还未访问过的每个元素(例如 [8,5,4,10,20,15,7]) 重复此过程,一直向左构建子树 (例如可以得到 3->9->8->5->4),并将构建的子树入栈 (例如得到栈 [3,9,8,5,4])。
  • 若栈顶元素(即上一次遍历的元素,例如 4)等于中序遍历下标指向的元素 (例如 4) ,则从栈内弹出一个元素 (例如 弹出 4),同时令中序遍历下标指向下一个元素 (例如 5) ,之后继续判断栈顶元素 (例如 5) 是否等于中序遍历下标指向的元素,若相等则重复该操作,直至栈为空或者元素不相等(例如 8 出栈以后,栈顶元素 9 与中序遍历元素 10 不同),这说明在栈顶元素(例如 8) 产生了分支,因此令当前元素 (例如 10) 作为最后一个相等元素(即刚刚出栈的元素 8 )的右节点。
  • 遍历结束,返回根节点。

代码如下:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    # 迭代 	56 ms
    def buildTree(self, preorder, inorder):
        if not preorder:
            return None    
        root = TreeNode(preorder[0])
        stack = []
        L = len(preorder)
        stack.append(root)
        index = 0               
        for i in range(1, L):
            preorderval = preorder[i]
            # 中序的当前 i 不等于栈顶时表示还没搜索到根节点,
            # 每次append的的preorder[i]其实都是其左子树,左子树的左子树,...
            if stack[-1].val != inorder[index]:     #进左子树
                node = stack[-1]
                node.left = TreeNode(preorderval)
                stack.append(node.left)
            #一旦中序inorder里的元素与栈顶相等时,表示左子树已经走完了
            else:
                # 如果栈弹空了,表示根节点root出栈了
                # == 时表示当前出栈元素没有右孩子
                while stack and stack[-1].val == inorder[index]:
                    node = stack[-1]
                    stack.pop()
                    index += 1     
                node.right = TreeNode(preorderval)      
                stack.append(node.right)
        return root     

t = Solution().buildTree([3,9,20,15,7], [9,3,15,20,7])
print(t.val, t.left.val, t.right.val)

时间复杂度:O(n) ,前序遍历和后序遍历都被遍历。

空间复杂度:O(n) ,额外使用栈存储已经遍历过的节点。

参考文章:

面试题07. 重建二叉树

迭代-栈图解:剑指07. (前序中序)重建二叉树:递归

蚂蚁集团前端面试全流程复盘:从简历准备到HR面高频题解析 在技术岗位求职中,面试不仅是知识点的检验,更是对候选人工程思维与问题解决能力的综合评估。以算法、数据结构、框架原理和系统设计为核心的考察维度,几乎贯穿所有大厂技术面。理解底层原理(如事件循环、Fiber架构、缓存机制)并能在实际场景中灵活运用,是区分普通候选人与优秀工程师的关键。从浏览器渲染到高并发页面优化,从代码实现到方案权衡,这些能力最终都会投射到具体的项目深挖和场景设计中。本文以一次完整的蚂蚁集团前端面试为样本,梳理了从投递准备、四轮技术面到HR面的全流程高频题与答题思路,帮助读者系统化备战高难度技术 阅读详情

相关推荐

【老生谈算法】可视化通道流中瞬时涡量场的算法实现与MATLAB源码分析——瞬时涡量场

本文旨在探讨可视化通道流中瞬时涡量场的方法,并通过MATLAB编程实现这一过程。涡量场作为描述流体旋涡强度和方向的重要物理量,对于理解复杂流体运动具有重要意义。本文首先介绍了涡量场的基本概念,随后详细阐述了从测量数据收集到涡量场可视化的完整流程,并给出了相应的MATLAB源码。通过实际运行该源码,我们展示了涡量场的可视化结果,并讨论了其在流动结构识别和动力学行为理解中的应用。关键词: 涡量场;流体运动;MATLAB;可视化;PIV一、引言。

m0_53407570的博客 1124

由中序和先序(后序)非递归重建二叉树 时间复杂度O(n)

算法过程: pre[n]为前序序列in[n]为中序序列vis[n]记录是否已在前序序列中出现 初始两个下标cur1=0,cur2=0 1.当pre[cur1]!=in[cur2]时cur1往前进一格,并且pre[cur1]号结点的左孩子为pre[cur1+1]号结点并记录vis[pre[cur1+1]]=1 while (in[cur2] != pre[cur1]) { tree[pre[cur1]].left = pre[cur1 + 1]; ...

qq_54846814的博客 1593

华为路由器静态路由配置实战:从零搭建企业级网络环境(含常见错误排查)

本文以真实企业组网案例为基础,详细解析华为路由器静态路由的实战配置流程。内容涵盖从网络拓扑规划、IP地址分配到具体的`ip route-static`命令配置,并重点讲解了缺省路由、浮动路由等进阶应用。文章还提供了系统化的排错指南,帮助网络工程师规避回程路由缺失、子网掩码错误等常见问题,是掌握企业级网络搭建与维护的实用指南。

weixin_29313817的博客 89

算法攻关 - 重建二叉树 (O(n))_0105

文章目录一、题目描述二、思路三、代码实现四、小结 一、题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制: 0 <= 节点个数 <= 5000 来源:

小诚信驿站 791

比亚迪璇玑架构:10ms级响应引领智能驾驶革命

比亚迪璇玑架构通过三大创新,实现10ms级控制响应时延,使AEB刹车距离比竞品缩短20米。

百态·数智思维 | 聚焦大数据、量化与未来AI 1255

creo二次开发使用映射

在creo进行二次开发时,一些无法直接通过访问底层代码来对特征进行操作,比如“镜像装配”,这个时候就可以使用映射(Mapkey)来完成一键镜像。 注:这是镜像装配的代码 ProError status; ProMacro macro; wstring Macro; strMacro = L"mapkey(continued) ~ Command ProCmdMirrorAssem ; mapkey(continued) ~ Activate mirror_component_dialog Sy

qq_49328512的博客 1607

python递归实现二叉树_python基于递归算法实现二叉树

二叉树是一种基础又十分重要树结构。本文首先介绍二叉树的基本原理,然后基于递归算法,利用python编程,实现二叉树的先序遍历、中序遍历、后序遍历这三种遍历方式。本文主要内容:1、二叉树的构造2、递归算法3、二叉树遍历方式4、递归实现先序遍历、中序遍历、后序遍历1、二叉树的构造:二叉树的每个结点最多有两棵子树(子树的左右顺序不能颠倒),即节点的度不大于2,且二叉树的第i层的结点个数最多为2^(i-1...

weixin_30615567的博客 1512

RT-DETR改进策略【独家融合改进】| SPD-Conv+PPA 再次提升模型针对小目标的特征提取能力

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1153

【数据结构】python实现二叉树

文章目录@[TOC](文章目录)一、二叉树的概念二、python代码1.定义抽象类2.定义结点类3.实现二叉树基本操作4.删除操作中用到的两个外部函数5.测试 一、二叉树的概念 二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点 二、python代码 1.定义抽象类 代码如下(示例): import abc class BST(metaclass

m0_52965867的博客 2859

自动化Ai Agent全流程实现【设计+代码】

本文探讨了人工智能代理(AI代理)如何通过自动化复杂的业务流程来帮助企业提高效率和降低成本。AI代理具有适应性、智力、自主性和可扩展性等特点,能够处理非结构化信息、在定义参数范围内做出判断、协调多个系统或利益相关者,以及处理变量输入和异常。文章详细介绍了AI代理在文件处理、客户服务、人才招聘和财务运作等领域的应用,并提供了一个逐步实现发票处理自动化的案例。此外,文章还强调了实施AI代理自动化的优势,包括效率提升、成本降低、准确性和可扩展性的改进,并提出了实施最佳实践,如从高影响力流程开始、设计人机交互、优先

FeelTouch Labs 894

基于simulink创建一个针对双馈异步风力发电机并网运行的仿真模型

摘要:本文详细介绍了基于Simulink的双馈异步风力发电机(DFIG)并网运行仿真建模方法。系统包含风速输入、风力机、双馈发电机、电力电子变换器、控制器和并网接口等模块,通过8个步骤完整呈现了建模流程,包括风速模拟、机械功率计算、发电机特性建模、变流器控制策略设计等关键环节。仿真可评估系统在不同风速条件下的动态响应、最大功率跟踪能力和发电效率,为风力发电系统的优化设计提供有效验证手段。模型可根据实际需求扩展环境因素和电网交互等细节,提高仿真精度。

amy_mhd的博客 333

递归--python实现列表创建二叉树

递归------python实现列表创建二叉树 1 # -*- coding:utf-8 -*- 2 3 '二叉树结点类' 4 class TreeNode: 5 def __init__(self, x): 6 self.val = x 7 self.left = None 8 self.right = None ...

cxu123321的博客 1913

7、RNA 二级结构预测:包含接吻发夹基序的新策略

本文提出三种用于预测RNA二级结构中接吻发夹基序的新策略,结合规范化规则与非歧义动态规划,分别在时间与空间复杂度之间进行权衡。策略A以O(n⁴)时间和O(n²)空间实现高效预测;策略B通过存储次优结果扩大搜索空间,空间复杂度升至O(n³);策略C全面探索组合可能,时间复杂度为O(n⁵),但保持O(n²)空间。实验表明不同策略适用于不同复杂度的序列,为RNA结构预测提供了灵活且可扩展的解决方案。

j7k8l的博客 132

python剑指 Offer 07. 重建二叉树

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

qq_33655102的博客 268

WINCC7.3破解文件

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

应届生Python面试核心挑战与高效备战指南

Python作为当前最流行的编程语言之一,其核心机制如GIL全局解释器锁、装饰器、生成器等概念是面试必考内容。理解这些底层原理不仅能帮助开发者编写高效代码,更是应对技术面试的关键。在工程实践中,多线程与多进程的选择、异步编程模型等技术的合理运用,直接影响系统性能。对于应届生而言,除了掌握基础概念,还需重点突破算法数据结构应用能力,如动态规划、二叉树遍历等高频考点。通过LeetCode系统训练和错题本管理,结合项目经验中的性能优化与工程化改造,可以全面提升Python技术栈的实战能力,为求职面试做好充分准备。

weixin_33951761的博客 307

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

猿辅导2020校招笔试编程题全解析:字符串压缩、任务调度与二叉树路径

在校招笔试中,算法题向来是区分度最高的环节,而数据结构与算法的综合运用能力往往决定最终成绩。字符串压缩考察遍历与边界处理,任务调度器涉及贪心策略和优先队列的灵活使用,二叉树最大路径和则要求掌握递归后序的思想本质。这些经典题型不仅出现在猿辅导的笔试中,也是各大互联网公司算法面试的高频考点。理解它们的原理,不仅有助于应对在线笔试平台上的编程题,更能培养解决实际工程问题时的抽象建模能力。从基础的数据结构入手,逐步深入到复杂场景的最优解推导,再到边界条件的系统化自查,本文将围绕校招笔试中的典型编程题展开,复盘完整解

weixin_33831196的博客 393

Python编程练习平台全攻略:从新手到高手的9个实战网站

编程学习的关键在于实践,而算法与数据结构是计算机科学的核心基础。通过系统性的刻意练习,开发者能将抽象概念转化为解决实际问题的能力,从而提升代码质量和工程效率。无论是准备技术面试、夯实语法基础,还是培养编程兴趣,选择合适的练习平台都至关重要。本文聚焦Python实战练习,深入解析LeetCode、Coding Games等九大平台的独特定位与使用策略,帮助读者构建个性化的学习路径,高效连接理论知识与项目实践。

weixin_34075268的博客 389

所有博客导航

。。

nameofcsdn的博客 1万+

二叉树_使用递归和迭代实现LeetCode二叉树重建

二叉树_使用递归和迭代实现LeetCode二叉树重建 题目描述:   输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制: 0 <= 节点个数 <= 5000 题目链接,来源:力扣 一、递归法 1、思路

AlexanderGan的博客 413

python构造二叉树_Python实现重建二叉树的三种方法详解

本文实例讲述了Python实现重建二叉树的三种方法。分享给大家供大家参考,具体如下:学习算法中,探寻重建二叉树的方法:用input 前序遍历顺序输入字符重建前序遍历顺序字符串递归解析重建前序遍历顺序字符串堆栈解析重建如果懒得去看后面的内容,可以直接点击此处本站下载完整实例代码。思路学习算法中,python 算法方面的资料相对较少,二叉树解析重建更少,只能摸着石头过河。通过不同方式遍历二叉树,可以得...

weixin_39663605的博客 601

重构二叉树(前序遍历和中序遍历)

二叉树的前序遍历是先遍历根节点,接着是左子树节点,最后是右子树节点,所以可以通过前序遍历确定树的根节点。 二叉树的中序遍历实现遍历二叉树的左子树节点,接着是根节点,最后是右子树节点,所以可以通过中序遍历找到根节点后,根节点左边的节点是左子树节点,根节点右边的节点是右子树节点。 利用上述两个理论就可以在知道前序遍历和中序遍历的情况下重构二叉树。 给定一棵树的前序遍历序列:1,2,3...

静陌慕春 1280

二叉树Python遍历和迭代方法实现

二叉树Python的各类实现二叉树的概念二叉树遍历和迭代方法python代码运行结果 本文介绍了二叉树的各类实现,并附上python代码 二叉树的概念 二叉树(Binary Tree)是包含n个节点的有限集合,该集合或者为空集(此时,二叉树称为空树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树组成。 二叉树遍历和迭代方法 该文中的概念和实现方法要求均来自LeetCod...

qq_30210107的博客 1227

二叉树遍历总结和重构

BinaryTree的各种操作,包括求高度、三种深度优先遍历方式(前序、中序、后续的递归和非递归)、层次遍历(宽度优先遍历) Leetcode题目: *1、144 先序遍历二叉树 * 2、 94 中序遍历二叉树 * 3、145 后序遍历二叉树 * 4、102 107 层次遍历二叉树 * 5、105 先序序列和中序序列重构二叉树 * 6、106 后序序列和中序序列重构二叉树**imp

没有人是一座孤岛 678

Python从中序与后序遍历序列构造二叉树

#!/usr/bin/python3 # -*- coding: utf-8 -*- # Author: zhangxinhong # @Time: 2021/6/10 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right """ 根据一棵树的中序遍历与后序遍历构造.

whuzhang16的博客 1259

二叉树的遍历和重构,二叉搜索树(python)

文章目录二叉树遍历前序遍历中序遍历后序遍历层次遍历重构二叉搜索树特点构建及相关操作简单拓展:AVL 二叉树遍历 构建树节点 class TreeNode(object): def __init__(self,data): self.data=data self.lchild=None self.rchild=None 前序遍历 root-左-右 def pre_track(root): if root: print(root,end=",") pre_track(root.lchi

sasemi 554

算法学习之重构二叉树

背景 根据提供的前序和中序遍历的结果,重构二叉树   思路 根据前序和中序的特点,来构造二叉树。 前序遍历,根左右,头一个一定是根结点。 中序遍历,左根右,根据由前序遍历确定的根结点,可以确定出左右子树的中序遍历结果,以及左右子树的元素数量。 而后,根据中序遍历确定的左右子树的元素数量,可以分出前序遍历中左右子树的范围。 最后,进行递归,后序遍历验之。   实现 代码如下 ...

四国棋客 413
上一篇: 【CTR模型】TensorFlow2.0 的 DeepFM 实现与实战(附代码+数据)
下一篇: CTR 模型之 Deep & Cross (DCN) 与 xDeepFM 解读
VariableX
博客等级 码龄7年 142粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值