Python面试宝典第8题:二叉树遍历

题目

        给定一棵二叉树的根节点 root ,返回它节点值的前序遍历。

        示例 1:

输入:root = [1,null,2,3]
输出:[1,2,3]

        示例 2:

输入:root = []
输出:[]

        示例 3:

输入:root = [1]
输出:[1]

基础知识

        二叉树属于一种常用的数据结构,是一个由零个或多个节点组成的层次结构。二叉树具有以下特征:

        1、每个节点最多有两个子节点,分别称为左子节点和右子节点。

        2、根节点位于树的最顶端,没有父节点。

        3、叶子节点没有子节点。

        4、非叶子节点至少有一个子节点。

        前序遍历是二叉树遍历的一种方式,其顺序遵循“根节点 -> 左子树 -> 右子树”的原则。具体步骤如下:

        1、访问当前节点:首先处理当前节点(打印节点值,或进行其他操作)。

        2、递归地遍历左子树:然后对当前节点的左子树进行前序遍历。

        3、递归地遍历右子树:最后对当前节点的右子树进行前序遍历。

        假如我们有以下的二叉树,则其前序遍历的顺序为:1 -> 2 -> 4 -> 5 -> 3。

    1/ \2   3/ \
4   5

递归法

        对于给定的二叉树,我们可以通过递归的方式来实现前序遍历。下面我们给出了用递归法解题的示例代码,具体的解题步骤如下。

        1、binary_tree_traversal_recursive 函数接收一个 TreeNode 类型的参数 root,它代表二叉树的根节点。函数内部定义了另一个名为 dfs 的辅助函数,该函数负责实际的递归遍历工作。

        2、在 dfs 函数中,我们先访问当前节点,然后递归访问左子树,最后递归访问右子树。

        3、遍历完成后,所有节点都已访问,dfs 函数逐级返回,最终 binary_tree_traversal_recursive 函数返回结果列表 result。

from typing import Listclass TreeNode:def __init__(self, val = 0, left = None, right = None):self.val = valself.left = leftself.right = rightdef binary_tree_traversal_recursive(root: TreeNode) -> List[int]:result = []def dfs(node):if node is None:return# 访问当前节点result.append(node.val)# 递归访问左子树dfs(node.left)# 递归访问右子树dfs(node.right)dfs(root)return resultright = TreeNode(2)
root = TreeNode(1, None, right)
right.left = TreeNode(3)
result = binary_tree_traversal_recursive(root)
print(result)

迭代法

        迭代法实现二叉树的前序遍历,关键在于利用栈来模拟递归的过程,确保节点的访问顺序符合“根节点 -> 左子树 -> 右子树”的规则。使用迭代法求解本题的主要步骤如下。

        1、初始化。创建一个栈,并将根节点压入栈中。同时,创建一个结果列表用于存放遍历结果。

        2、循环处理。当栈不为空时,执行以下操作:

        (1)弹出栈顶元素。将栈顶元素弹出,并将其值添加到结果列表中,这是因为前序遍历先访问根节点。

        (2)处理右子树。如果当前节点有右子节点,将右子节点压入栈中。这是因为,右子节点应当在其左子树访问完后再访问,故右子节点应最后处理。

        (3)处理左子树。如果当前节点有左子节点,将左子节点压入栈中。这是因为,左子节点应在当前节点的右子节点之前访问。

        3、结束条件。当栈为空时,所有节点都被访问过,遍历结束。

        根据上面的算法步骤,我们可以得出下面的示例代码。

from typing import Listdef binary_tree_traversal_iteration(root: TreeNode) -> List[int]:if not root:return []stack, result = [root, ], []while stack:# 弹出栈顶元素并访问node = stack.pop()if node:# 访问栈顶节点result.append(node.val)# 栈顶元素出栈后,先压右子节点,保证右子节点最后访问if node.right:stack.append(node.right)# 然后压左子节点if node.left:stack.append(node.left)return resultright = TreeNode(2)
root = TreeNode(1, None, right)
right.left = TreeNode(3)
result = binary_tree_traversal_iteration(root)
print(result)

总结

        递归法的时间复杂度为O(n),每个节点被访问一次。空间复杂度最好情况下为O(log n)(此时为平衡树),最坏情况下为O(n)(此时为高度为n的斜树)。递归法的实现直观反映了前序遍历的逻辑,即“根-左-右”,但存在栈溢出、空间复杂度较高等缺点。

        迭代法的时间复杂度也为O(n),每个节点被访问一次。空间复杂度为O(h),其中h是树的高度。对于平衡树来说为O(log n),最坏情况下(高度为n的斜树)为O(n)。相较于递归法,迭代法使用显式栈管理,空间复杂度更加可控。此外,迭代法没有递归调用栈的限制,适用于处理大规模或深度极大的二叉树。

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

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

相关文章

设计模式的一点理解

设计模式需要变化的角度看问题,思考和应对未来可能发生的变化; 在设计模式中,“封装变化”是一个核心原则,它强调了软件设计应该关注分离那些可能会变化的部分,以便在不影响系统其余部分的情况下,容易地修改…

谷歌学术与百度学术界面设计之比较:简约与华丽的对决

关于学术搜索,众所周知,谷歌学术与百度学术乃是两大翘楚选手,分别源自美中两地,竞相问鼎学术领域之巅。今番,笔者将为诸位剖析这两款学术搜索引擎之异同及优劣。 界面设计:谁更吸引眼球? 接下…

怎样在 PostgreSQL 中优化对大数值类型数据的计算?

文章目录 一、选择合适的数据类型二、索引优化三、查询语句优化四、数据库配置调整五、使用扩展功能六、示例七、总结 在 PostgreSQL 中处理大数值类型数据(例如 BIGINT、NUMERIC 等)的计算时,可能会遇到性能瓶颈。为了优化这些计算&#xff…

深度探讨:Facebook在全球范围内的社会影响力

Facebook作为全球最大的社交平台之一,不仅改变了人们的社交方式,还对全球社会产生了深远的影响。本文将从多个角度探讨Facebook在全球范围内的社会影响力,深入分析其对个人、社区和全球社会的多方面影响。 1. 信息传播与社交互动的革新 Fac…

云原生监控-Kubernetes-Promethues-Grafana

云原生监控-Prometheus 作者:行癫(盗版必究) 引读:本文章所涉及到技术点包括Prometheus、Grafana、Kuebrnetes;Prometheus基于外部构建采集并监控Kubernetes集群以及集群中的应用,例如使用mysql-node-exporter、nginx-node-exporter采集Kuebrnetes集群中的应用数据,使用…

语言模型的进化:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中,自然语言处理(NLP)一直是一个充满挑战和机遇的领域。随着技术的发展,我们见证了从传统规则到统计机器学习,再到深度学习和预训练模型的演进。如今,我们站在了大型语言模型&#xff…

音频demo:将PCM数据和Speex数据进行相互编解码

1、README a. libspeex移植步骤 源码下载地址:https://xiph.org/downloads/ 或 https://www.speex.org/downloads/ 或 https://www.linuxfromscratch.org/blfs/view/svn/multimedia/speex.html tar xzf speex-1.2.1.tar.gzcd speex-1.2.1/./configure --prefix$PW…

政安晨:【Keras机器学习示例演绎】(五十三)—— 使用 TensorFlow 决策森林进行分类

目录 简介 设置 准备数据 定义数据集元数据 配置超参数 实施培训和评估程序 实验 1:使用原始特征的决策森林 检查模型 实验 2:目标编码决策森林 创建模型输入 使用目标编码实现特征编码 使用预处理器创建梯度提升树模型 训练和评估模型 实验…

社区6月月报 | Apache DolphinScheduler重要修复和优化记录

各位热爱Apache DolphinScheduler的小伙伴们,社区6月月报更新啦!这里将记录Apache DolphinScheduler社区每月的重要更新,欢迎关注。 月度Merge Stars 感谢以下小伙伴上个月为Apache DolphinScheduler所做的精彩贡献(排名不分先后…

矩阵式键盘最小需要多少个IO驱动

1. 概述 矩阵式键盘由于有其占用硬件资源少的优点有着极其广泛的应用,如PC键盘、电话按键、家用电器等等这类产品.矩阵键盘的基本原理如下所示(仅是原理示例,实际实现上还会为每个按键加上防倒流的二极管解决“鬼影”问题)&#x…

Windows下编译OpenSSL静态库

目录 1. 版本与下载地址 2. 下载与安装VS2015 3. 下载与安装Perl 4. 测试ActivePerl是否安装正确 5. 下载OpenSSL 6. 编译32位OpenSSL静态库 6.1 解压openssl-1.0.2l.tar.gz 6.2 打开VS2015 x86本机工具命令提示符 6.3 输入命令进入到openssl的目录中 6.4 执行配置命…

完美解决AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘的正确解决方法,亲测有效!!!

完美解决AttributeError: ‘DataFrame’ object has no attribute ix’的正确解决方法,亲测有效!!! 亲测有效 完美解决AttributeError: DataFrame object has no attribute ix的正确解决方法,亲测有效!&…

(十五)GLM库对矩阵操作

GLM简单使用 glm是一个开源的对矩阵运算的库&#xff0c;下载地址&#xff1a; https://github.com/g-truc/glm/releases 直接包含其头文件即可使用&#xff1a; #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <io…

Spring 集成测试指南

在软件开发中&#xff0c;集成测试是一种重要的测试方法&#xff0c;用于验证应用程序各个模块之间的协同工作是否正常。Spring 提供了强大的 Spring Test 模块&#xff0c;以及 MockMvc 工具来进行 HTTP 请求的模拟和验证。本文将介绍如何在 Spring 中进行集成测试&#xff0c…

深入解析ROC曲线及其应用

深入解析ROC曲线及其应用 什么是ROC曲线&#xff1f; ROC曲线&#xff08;Receiver Operating Characteristic Curve&#xff09;&#xff0c;即受试者工作特征曲线&#xff0c;是一种用于评估分类模型性能的工具。它通过展示真阳性率&#xff08;TPR&#xff09;与假阳性率&…

免费制作GIF和实时网络监控工具

ScreenToGif 不允许你们还不知道的一款免费且实用好用的GIF动画制作工具软件。可以实时对区域窗口录制、编辑录制多功能模块&#xff0c;操作简单。 支持自定义增减重复帧数、调整循环播放次数、调整播放速度及删除重复帧。 支持对帧做二次编辑&#xff0c;可进行帧翻转、缩放…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署ComfyUI:功能最强大、模块化程度最高的Stable Diffusion图形用户界面和后台

目录 ComfyUI的特性介绍 开始安装 做点准备工作 在Conda虚拟环境中进行 依赖项的安装 运行 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&…

2.1 【入门篇】Cortex M芯片与内核

一,Cortex M芯片简介 Cortex M系列芯片是ARM公司设计的一系列微控制器(MCU),广泛用于嵌入式系统。Cortex M系列芯片主要分为以下几种型号,每种型号都有其独特的特点和应用场景: Cortex-M0和M0+: 特点:这是Cortex M系列中最基本、最低功耗的型号,设计简单,适合成本敏…

昇思训练营打卡第二十天(CycleGAN图像风格迁移互换)

CycleGAN&#xff08;循环生成对抗网络&#xff09;是一种生成对抗网络&#xff08;GAN&#xff09;&#xff0c;它能够在没有成对训练样本的情况下&#xff0c;将一种风格的图片转换成另一种风格。CycleGAN通常用于图像到图像的转换任务&#xff0c;比如将马的图片转换成斑马的…

PHP 高级过滤器

PHP 高级过滤器 PHP 是一种广泛使用的开源服务器端脚本语言,特别适用于网页开发。在处理用户输入和数据交互时,安全性是一个重要的考虑因素。PHP 提供了一套强大的过滤器扩展,用于验证和净化数据。本文将深入探讨 PHP 的高级过滤器功能,包括其使用方法、优势以及在开发中的…