一文搞懂二叉树先序遍历的三种方法

news2024/9/29 19:30:55

系列文章:

相关题目:
144. 二叉树的前序遍历

在这里插入图片描述
先序遍历结果为:1 2 4 5 3 6 7

总体上分为两种框架,递归框架和非递归框架,递归框架又分为两种思路:分解思路和遍历思路。

  • 递归
    1、分解思路 【分解为子问题】
    2、遍历思路 【更新外部变量】
  • 非递归
    3、借助栈

下面代码对三种方法逐一实现。

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

class preorderTraversal:
    """
    总体上分为两种框架,递归框架和非递归框架,递归框架又分为两种思路:分解思路和遍历思路。
    递归
        1、分解思路 【分解为子问题】
        2、遍历思路 【更新外部变量】
    非递归
        3、借助栈

    144. 二叉树的前序遍历
    https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
    """
    def solution1(self, root):
        """
        前序遍历【分解思路 -- 子问题】
        递归函数需要有返回值,然后将左子树的返回值、右子树的返回值以及根节点的值,按照顺序拼接起来即可。
        通常为自底向上求解
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return []
        return [root.val] + self.solution1(root.left) + self.solution1(root.right)

    def solution1_1(self, root):
        """
        分解思路,同上
        :param root:
        :return:
        """
        res = []
        if not root:
            return []

        res.append(root.val)
        res.extend(self.solution1_1(root.left))
        res.extend(self.solution1_1(root.right))

        return res

    def solution2(self, root):
        """
        遍历思路,一般需要借助递归函数,递归函数没有返回值,靠更新外部变量得到结果
        :param root:
        :return:
        """
        self.res = []
        self.traverse(root)
        return self.res

    def traverse(self, node):
        if not node:
            return

        self.res.append(node.val)
        self.traverse(node.left)
        self.traverse(node.right)

    def solution3(self, root):
        """
        非递归思路,借助栈 实现
        :param root:
        :return:
        """
        res = []
        if not root:
            return res
        else:
            stk = [root]
            while stk:
                cur = stk.pop()
                res.append(cur.val)

                if cur.right:
                    stk.append(cur.right)

                if cur.left:
                    stk.append(cur.left)

        return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1073145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OLED透明拼接屏在乌海湖旅游区的应用探究

作为一名资深的OLED透明拼接屏工程师,我希望通过这篇文章来介绍一下OLED透明拼接屏在乌海这座城市中的表现,并对该城市的历史、景点、管辖范围进行简要介绍。 最后,我将讨论OLED透明拼接屏在乌海适用的行业和领域,并列举一些优缺…

在windows7中运行pycharm报错误“无法定位程序输入点 CreateAppContainerProfile 于动态链接库 USERENV.dll 上

截图: 解决办法: 一时不知道怎么办。一想之前是好好的,不知道被什么破坏了。所以恢复系统解决。

Prometheus集成consul[被监控对象开启basic认证]

1,被监控对象开启basic认证 具体操作这里不再详细细讲。 2,将被监控对象注册到consul 由于被监控对象开启了basic认证,注册到consul后显示:401 Unauthorized Output: Unauthorized,不能够正常健康检查。 3&#xff0c…

找不到d3dx9_35.dll,无法继续执行代码解决方法

今天,我要和大家分享:d3dx9_35.dll丢失怎么解决。 首先,我们需要了解什么是d3dx9_35.dll文件。d3dx9_35.dll是一个动态链接库文件,它是DirectX 9中的一个重要组件,通常被用于游戏和多媒体软件中。如果我们的电脑中缺少…

功能测试复习

一。测试流程 1.需求评审 确保各部门需求理解一致 2.计划编写 测什么,谁来测,怎么测 3.用例设计 验证项目是否符合需求的操作文档 4.用例执行 项目模块开发完成开始执行用例文档实施测试 5.缺陷管理 对缺陷进行…

图片上传并映射回显

目录 简介 代码展示 1、配置图片保存地址 2、拦截器配置映射地址 3、接口 简介 我们知道文件的上传就是把本地的文件上传到服务器上(在服务器中指定地址保存);通过访问服务器地址去查看文件;但是直接通过域名和保存地址是无…

【单片机】17-温度传感器DS18B20

1.DS18B20相关背景知识 1.温度传感器 (1)测温度的方式:物理(汞柱,气压),电子(金属电性能随温度变化) (2)早期:热敏电阻(模…

青岛建筑模板厂家有哪些?

在青岛地区,有许多建筑模板厂家供应各类建筑模板材料。其中,一家备受认可的建筑模板厂家是广西贵港市的能强优品木业公司。该公司具备全面的生产能力和优质的产品质量,在青岛地区的建筑施工企业中有着广泛的合作经验。 能强优品木业公司提供全…

【密评】商用密码应用安全性评估从业人员考核题库(八)

商用密码应用安全性评估从业人员考核题库(八) 国密局给的参考题库5000道只是基础题,后续更新完5000还会继续更其他高质量题库,持续学习,共同进步。 1751 判断题 根据GM/T0016《智能密码钥匙密码应用接口规范》&#x…

【Vue面试题十二】、说说你对双向绑定的理解?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:双向数据绑定是什么 一、…

VMware Workstation Player 17 下载安装教程

虚拟机系列文章 VMware Workstation Player 17 免费下载安装教程 VMware Workstation 17 Pro 免费下载安装教程 windows server 2012安装教程 Ubuntu22.04.3安装教程 FTP服务器搭建 VMware Workstation Player 17 下载安装教程 虚拟机系列文章前言一、 VMware Workstation Pla…

是炒作还是大势所趋?电商企业7 种日渐盛行的 API 管理应用场景

17 世纪兴起的纸质货币改变了全球经济的面貌,开创了国际货币监管的新时代。货币能带来如此重大的颠覆,主要原因在于它有着标准化“交换媒介”的能力。在技术和数字化世界中,API 产生了类似的效果,它创建了标准化、可重复使用、安全…

CSS 中::after的妙用(实现在margin中显示内容)

效果图如下: 背景: 如上图,之前只是当纯的写一个参考货架平面图,用作物料系统的在库状态可视化,当完成页面body分成10等份时,货架之间需要有通道,为了实现实际的样式,我给每个等份都…

FPGA实现电机霍尔编码器模块

一. 简介 想要知道直流电机的转速,就需要用到编码器,常用的编码器有霍尔和光电两种,但是光电编码器比较贵(性能好于霍尔),所以平常的时候使用最多的是霍尔编码器了。 霍尔编码器一般有AB两相信号输出,默认的时候为低…

AB试验(五)实验过程中的一些答疑解惑

AB试验(五)实验过程中的一些答疑解惑 实验结果不显著怎么办 出现实验结果不显著的原因 A/B测试的变化确实没有效果,两组指标在事实上是相同的A/B测试的变化有效果,但由于变化的程度很小,测试灵敏度power不足&#x…

Linux 安全 - LSM机制

文章目录 前言一、LSM起源二、LSM简介2.1 MAC2.2 LSM特征 三、Major and Minor LSMs3.1 Major LSMs3.2 Minor LSMs3.3 BPF LSM 四、LSM 框架五、LSM Capabilities Module六、LSM hooks 说明参考资料 前言 在这两篇文章中介绍了 Linux 安全机制 Credentials : Linu…

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题 在实际开发中,经常会遇到引脚资源受限需要将一些具有特定功能的引脚配置为普通引脚或其他引脚功能使用的情况。 博主之前遇到过类似的情况,都正常解决了。但偶尔也会出现在配置引脚时少了一些配…

Go语言基础学习教程(一)导学部分

Go语言基础 将在工作中学习的东西整理出来作为一个简单的Go语言基础教程 Go语言 Go语言(Golang)是Google公司2009年推出的一门"高级编程言语", 目的是为了解决: "现有主流编程语言"明显落后于硬件发展速度的问题不能合理利用多核CPU的优势提升软件系统性…

ref与DOM-findDomNode-unmountComponentAtNode知识点及应用例子

​​​​​​http​​​http://t.csdnimg.cn/og3BI 知识点讲解↑ 需求: (下载/导出 用post请求时:) 实例: react部分代码 1、点击下载按钮,需要传给后端数据,到数据扁平,不是那么复杂,只需url地址即可完成下载,后端…

靶场通关记录

目录 一、信息收集-端口扫描 目标开放端口收集 目标端口对应服务探测 信息收集-端口测试 二、 22-SSH弱口令爆破(挂着干别的) 80-HTTP端口的信息收集 三、信息收集-目录访问 漏洞利用-getwebshell 总结 getwebshell → 源码注释发现用户名 → robots.txt发现base64密码 …