【数据结构】树的遍历

树的遍历

前序遍历

前序遍历是按照根节点->左子树->右子树的顺序进行遍历
在这里插入图片描述

图片来源维基百科深度优先遍历(前序遍历): F, B, A, D, C, E, G, I, H.

代码实现
递归
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# @param root TreeNode类 
# @return int整型一维数组
class Solution:
    def preorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        if not root:
            return []
        return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)
非递归
class Solution:
    def preorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        if not root:
            return []
        node_stack = []
        ans = []

        node_stack.append(root)
        while node_stack:
            node = node_stack.pop(-1)
            if node.right:
                node_stack.append(node.right)

            if node.left:
                node_stack.append(node.left)

            ans.append(node.val)

        return ans

牛客 BM23 二叉树的前序遍历

中序遍历

中序遍历是按照左子树->根节点->右子树的顺序进行遍历

在这里插入图片描述

图片来源维基百科深度优先遍历(中序遍历): A, B, C, D, E, F, G, H, I.

代码实现
递归
class Solution:
    def inorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        if not root:
            return []
        return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
非递归
class Solution:
    def inorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        if not root:
            return []

        node_stack = []
        ans = []

        while node_stack or root:
            while root:
                node_stack.append(root)
                root = root.left

            node = node_stack.pop(-1)
            ans.append(node.val)
            root = node.right

        return ans

牛客 BM24 二叉树的中序遍历

后序遍历

中序遍历是按照左子树->右子树->根节点的顺序进行遍历

在这里插入图片描述

图片来源维基百科深度优先搜索(后序遍历):A, C, E, D, B, H, I, G, F.

代码实现
递归
class Solution:
    def postorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        if not root:
            return []
        return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]
非递归
class Solution:
    def postorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        if not root:
            return []

        pre = None
        node_stack = []
        ans = []
        while root or node_stack:
            # 每次先找到最左边的节点
            while root:
                node_stack.append(root)
                root = root.left

            node = node_stack.pop(-1)
            # 如果该元素的右边没有或是已经访问过
            if not node.right or node.right is pre:
                ans.append(node.val)
                pre = node
            else:
                node_stack.append(node)
                root = node.right
        return ans

层次遍历

层次遍历是按照从上往下、从左往右一层层进行遍历

在这里插入图片描述

图片来源维基百科广度优先遍历 - 层次遍历:F, B, G, A, D, I, C, E, H.

方法
  1. 判断二叉树是否为空,空树返回空列表。
  2. 建立辅助队列,根节点入队。
  3. 每次进入一层,统计队列中元素的个数。因为每当访问完一层,下一层作为这一层的子节点,一定都加入队列,而再下一层还没有加入,因此此时队列中的元素个数就是这一层的元素个数。
  4. 每次遍历一层对应元素数量的节点,将其依次从队列中弹出,数值加入该层结果列表,若存在子节点,依次加入队列排队等待访问。
  5. 访问完这一层的元素后,将这个一维数组加入二维数组中,再访问下一层。
代码实现
class Solution:
    def levelOrder(self , root: TreeNode) -> List[List[int]]:
        # write code here
        if not root:
            return []
        node_queue = []
        ans = []
        node_queue.append(root)

        while node_queue:
            ans_row = []
            n = len(node_queue)
            for i in range(n):
                node = node_queue.pop(0)
                ans_row.append(node.val)
                if node.left:
                    node_queue.append(node.left)
                if node.right:
                    node_queue.append(node.right)
            ans.append(ans_row)

        return ans

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[笔记] GICv3/v4 ITS 与 LPI

0. 写在前面 由于移植一个 pcie 设备驱动时,需要处理该 pcie 设备的 msi 中断(message signaled interrup)。 在 ARM 中, ARM 建议 msi 中断实现方式为: pcie 设备往 cpu 的一段特殊内存(寄存器)写某一个值&#xff0…

浅析xxl-obj分布式任务调度平台RCE漏洞

文章目录 前言本地环境搭建1、初始化数据库2、搭建调度中心3、搭建出执行器 XXL-JOB漏洞1、后台弱口令->RCE2、未授权API->RCE3、默认accessToken4、CVE-2022-361575、SSRF漏洞->RCE 总结 前言 在日常开发中,经常会用定时任务执行某些不紧急又非常重要的事…

c# 捕获全部线程的异常 试验

1.概要 捕获全部线程的异常 试验,最终结果task的异常没有找到捕获方法 2.代码 2.1.试验1 2.1.1 试验结果 2.2 代码 2.2.1主程序代码 using NLog; using System; using System.Threading; using System.Windows.Forms;namespace 异常监控 {static class Program…

【C#】知识点实践序列之Lock简单解决并发引起数据重复问题

欢迎来到《小5讲堂之知识点实践序列》文章,大家好,我是全栈小5。 这是2023年第3篇文章,此篇文章是C#知识点实践序列文章,博主能力有限,理解水平有限,若有不对之处望指正! 本篇在Lock锁定代码块基…

主浏览器优化之路2——Edge浏览器的卸载与旧版本的重新安装

Edge浏览器的卸载与旧版本的重新安装 引言开整寻找最年轻的她开始卸载原本的Edge工具下载后新版本的安装 结尾 引言 (这个前奏有点长,但是其中有一些我的思考顿悟与标题的由来,望耐心) 我在思考这个系列的时候 最让我陷入困得是…

python 深度学习 记录遇到的报错问题10

本篇继python 深度学习 解决遇到的报错问题9_module d2l.torch has no attribute train_ch3-CSDN博客 一、CUDA error: no kernel image is available for execution on the device CUDA kernel errors might be asynchronously reported at some other API call,so the stackt…

架构设计的核心:从多个维度理论分析

文章目录 一、如何实现高内聚低耦合的架构1、确定边界2、内聚的分类3、耦合的分类4、如何实现高内聚低耦合(1)耦合关注点(2)低耦合原则(3)高内聚原则 二、如何实现可扩展性的架构1、扩展性:核心…

机器人活动区域 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 现有一个机器人,可放置于 M x N 的网格中任意位置,每个网格包含一个非负整数编号,当相邻网格的数字编号差值的绝对值小于等于 1 时机器人可以在网格间移动。 问题: 求机器人可活动的最大范围对应的网格点数目。 说明: 网格…

G-LAB|2024年1月份最新的开班计划

1🈷最新的开班计划 👇👇👇 思科华为HCIA、HCIP、红帽RHCE 可预约免费试听

C#/.NET/.NET Core推荐学习书籍(23年12月更新)

前言 古人云:“书中自有黄金屋,书中自有颜如玉”,说明了书籍的重要性。作为程序员,我们需要不断学习以提升自己的核心竞争力。以下是一些优秀的C#/.NET/.NET Core相关学习书籍,值得.NET开发者们学习和专研。书籍已分类…

微服务智慧工地信息化解决方案(IOT云平台源码)

智慧工地是指应用智能技术和互联网手段对施工现场进行管理和监控的一种工地管理模式。它利用传感器、监控摄像头、人工智能、大数据等技术,实现对施工现场的实时监测、数据分析和智能决策,以提高工地的安全性、效率和质量。 智慧工地平台是一种智慧型、系…

Linux 详解:最完整的入门指南

Linux 是当今最流行的操作系统,仅次于 Windows 和 MacOS。这个开源系统是免费的,在可靠性、安全性和灵活性方面有着悠久的历史。 由于Linux存在于许多设备中并带来了许多优势,因此了解它是什么以及它如何影响计算机行业是至关重要的。 本文…

一呼百应API实时获取商品详情的实现

一、引言 随着电子商务的飞速发展,快速准确地获取商品详情变得尤为重要。一呼百应作为一家知名的B2B采购平台,提供了丰富的商品信息和交易数据。通过一呼百应的API接口,开发者可以实时获取商品详情,为业务决策和数据分析提供有力…

D4145 为什么是交流电源插座接地故障中断器的低功率控制器,有什么作用?

D4145 是。 在发生有 害或致命冲击前,这些器件检测是否有危险的接地情况,比如设备( 与 AC 线路反相连接) 与水以及与裸露电线接触。内含一个 26V 齐纳并联稳压 器、 一个运算放大器和一个 SCR 驱动器。 D4145 新增了两个感测变压 器、一个整流桥、一个 S…

哨兵1号回波数据(L0级)FDBAQ压缩算法详解

本专栏目录: 全球SAR卫星大盘点与回波数据处理专栏目录-CSDN博客 1. 全球SAR卫星回波数据压缩算法统计 各国的SAR卫星的压缩算法按照时间轴排列如下: 可以看出传统的分块BAQ压缩算法(上图粉色)仍然是主流,哨兵1号其实也有传统的BAQ压缩模式。 本文介绍哨兵1号用的FDBAQ算…

如何使用Plex在Windows系统搭建个人媒体站点公网可访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…

cocos creator + vscode debug

安装插件 安装插件:JavaScript Debugger 配置 7456 为本地cocos creator的启动端口 启动debug调试 选择对应的启动方式

Sift 图片匹配

1. 模式匹配结果 2. 结果的可视化 3. 基于我们找到的匹配猜测仿射变换 4. 调整findHomo的参数,寻找最好的一堆参数 5. 带着新的仿射变换的信息,筛选我们的匹配

Linux之下载安装

rpm包管理 rpm介绍 rpm用于互联网下载包的打包及安装工具,他包含在某些linux分发版本中。他生成具有.rpm扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似windows的steup.exe。 rpm包的查询指令 查询已经安装…

新的centos7.9安装docker版本的jenkins2.436.1最新版本-前端项目发布(五)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/n…