[leetcode] 面试经典 150 题——篇9:二叉树(番外:二叉树的遍历方式)

二叉树的遍历是指按照某种顺序访问二叉树中的每个节点。常见的遍历方式有四种:前序遍历(Pre-order Traversal)中序遍历(In-order Traversal)后序遍历(Post-order Traversal)以及层序遍历(Level-order Traversal)。每种遍历方式根据访问根节点的时机不同而有所区别。


概述

前序遍历(Pre-order Traversal)

在前序遍历中,首先访问根节点,然后递归地以前序方式遍历左子树,最后递归地以前序方式遍历右子树。即访问顺序为:根 -> 左 -> 右

  • 算法步骤:
    • 访问根节点。
    • 对根节点的左子树进行前序遍历。
    • 对根节点的右子树进行前序遍历。

中序遍历(In-order Traversal)

在中序遍历中,首先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。即访问顺序为:左 -> 根 -> 右

  • 算法步骤:
    • 对根节点的左子树进行中序遍历。
    • 访问根节点。
    • 对根节点的右子树进行中序遍历。

对于二叉查找树(BST),中序遍历将返回按升序排列的节点值


后序遍历(Post-order Traversal)

在后序遍历中,首先递归地以后序方式遍历左子树,然后递归地以后序方式遍历右子树,最后访问根节点。即访问顺序为:左 -> 右 -> 根

  • 算法步骤:
    • 对根节点的左子树进行后序遍历。
    • 对根节点的右子树进行后序遍历。
    • 访问根节点。

层序遍历(Level-order Traversal)

层序遍历又称广度优先遍历(BFS, Breadth-first Search),是按照从上到下、从左到右的顺序逐层访问树中的所有节点。与前面三种遍历方法不同的是,它不是递归实现的,而是通常使用队列来辅助完成。

  • 算法步骤:
    • 创建一个队列并将根节点加入队列。
    • 当队列非空时,重复以下操作:
      • 出队并访问队首节点。
      • 将访问节点的左孩子和右孩子依次入队(如果存在的话)。

每种遍历方式都有其特定的应用场景,例如,前序遍历常用于复制树,中序遍历用于二叉查找树的排序输出,后序遍历可用于删除或释放节点资源,而层序遍历则有助于找到最短路径等问题。


例子

示例二叉树

假设我们有以下二叉树:

        1/ \2   3/ \   \4   5   6
  • 根节点是 1
  • 左子树的根是 2,右子树的根是 3
  • 节点 2 的左孩子是 4,右孩子是 5
  • 节点 3 的右孩子是 6

前序遍历

访问顺序:根 -> 左 -> 右

[1, 2, 4, 5, 3, 6]

代码实现:

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef pre_order_traversal(root):result = []def traverse(node):if not node:returnresult.append(node.val)  # 访问根节点traverse(node.left)      # 遍历左子树traverse(node.right)     # 遍历右子树traverse(root)return result# 构建二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.right = TreeNode(6)
print(pre_order_traversal(root))  # 输出: [1, 2, 4, 5, 3, 6]

中序遍历

访问顺序:左 -> 根 -> 右

[4, 2, 5, 1, 3, 6]

代码实现:

def in_order_traversal(root):result = []def traverse(node):if not node:returntraverse(node.left)      # 遍历左子树result.append(node.val)  # 访问根节点traverse(node.right)     # 遍历右子树traverse(root)return resultprint(in_order_traversal(root))  # 输出: [4, 2, 5, 1, 3, 6]

后序遍历

访问顺序:左 -> 右 -> 根

[4, 5, 2, 6, 3, 1]

代码实现:

def post_order_traversal(root):result = []def traverse(node):if not node:returntraverse(node.left)      # 遍历左子树traverse(node.right)     # 遍历右子树result.append(node.val)  # 访问根节点traverse(root)return resultprint(post_order_traversal(root))  # 输出: [4, 5, 2, 6, 3, 1]

层序遍历

访问顺序:从上到下、从左到右逐层访问

[1, 2, 3, 4, 5, 6]

代码实现:

from collections import dequedef level_order_traversal(root):if not root:return []result = []queue = deque([root])  # 初始化队列,根节点入队while queue:node = queue.popleft()  # 出队并访问当前节点result.append(node.val)if node.left:  # 如果左孩子存在,入队queue.append(node.left)if node.right:  # 如果右孩子存在,入队queue.append(node.right)return resultprint(level_order_traversal(root))  # 输出: [1, 2, 3, 4, 5, 6]

总结

遍历方式访问顺序示例结果
前序遍历根 -> 左 -> 右[1, 2, 4, 5, 3, 6]
中序遍历左 -> 根 -> 右[4, 2, 5, 1, 3, 6]
后序遍历左 -> 右 -> 根[4, 5, 2, 6, 3, 1]
层序遍历按层从左到右[1, 2, 3, 4, 5, 6]

不同遍历方式适用于不同的场景,例如:

  • 前序遍历:用于复制树、序列化树。
  • 中序遍历:用于二叉查找树的排序输出。
  • 后序遍历:用于删除树或释放资源。
  • 层序遍历:用于寻找最短路径或按层级处理节点。

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

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

相关文章

es基本概念

Elasticsearch 的架构与基本概念 Elasticsearch(简称 ES)是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它被广泛用于全文搜索、日志分析、实时数据分析等场景。以下是其架构概述及其基本概念的详细解释。 Elasticsearch 的架…

《星环之城:量子迷雾下的网络安全战记》

点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 序章:星环之陨 公元2145年,人类在火星轨道上建造了“星环之城”——一座由量子网络连接的太空城邦。它的中枢AI“盖娅”掌控着地球与殖民地的数据洪流&#xff…

《全栈+双客户端Turnkey方案》架构设计图

今天分享一些全栈双客户端Turnkey方案的架构与结构图。 1:三种分布式部署方案:网关方案,超级服务器单服方案,直连逻辑服方案 2: 单服多线程核心架构: 系统服务逻辑服服务 3: 系统服务的多线程池调度设计 4:LogicServer Update与ECS架构&…

打破界限:Android XML与Jetpack Compose深度互操作指南

在现有XML布局项目中逐步引入Jetpack Compose是现代Android开发的常见需求。本指南将全面介绍混合使用的最佳实践、技术细节和完整解决方案。 一、基础配置 1.1 Gradle配置 android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3…

React-narice安卓打包流程

**1. 生成签名密钥 在项目的 android/app 目录下生成签名密钥的步骤: 打开终端或命令提示符:导航到您的 React Native 项目的 android/app 目录。 运行以下命令生成密钥库文件: keytool -genkeypair -v -keystore my-release-key.keystor…

嵌入式AI开源生态指南:从框架到应用的全面解析

嵌入式AI开源生态指南:从框架到应用的全面解析 引言 随着人工智能技术的迅速发展,将AI能力部署到边缘设备上的需求日益增长。嵌入式AI通过在资源受限的微控制器上运行机器学习模型,实现了无需云连接的本地智能处理,大幅降低了延…

深度学习中模型量化那些事

在深度学习中模型量化可以分为3块知识点,数据类型、常规模型量化与大模型量化。本文主要是对这3块知识点进行浅要的介绍。其中数据类型是模型量化的基本点。常规模型量化是指对普通小模型的量化实现,通常止步于int8的量化,绝大部分推理引擎都…

Redis-list类型

这里只是介绍命令使用 列表是用来存储多个有序的字符串 可以用来充当栈和队列的角色 列表特点: 列表中的元素是有序的,可以通过索引下标来获取某个元素或者某个范围的元素 获取和删除有区别 元素可以重复 命令 LPUSH 将一个或者多个元素从左侧放入到list中(头插法) lp…

Business English Certificates (BEC) 高频词汇背诵

Business English Certificates {BEC} 高频词汇背诵 References Cambridge English: Business Certificates, also known as Business English Certificates (BEC), are a suite of three English language qualifications for international business. abandon /əˈbndən/ …

第十四届蓝桥杯省赛真题解析(含C++详细源码)

第十四届蓝桥杯省赛 整数删除满分思路及代码solution1 (40% 双指针暴力枚举)solution 2(优先队列模拟链表 AC) 冶炼金属满分代码及思路 子串简写满分思路及代码solution 1(60% 双指针)solution 2&#xff0…

AI Agent开发大全第二十一课-如何开发一个MCP(从0开发一个MCP Client)

开篇 上一章《AI Agent开发大全第二十课-如何开发一个MCP(从0开发一个MCP Server)》里我们讲了如何从0开始开发一个MCP Server。可以看到文中大量细节为MCP发明者官网Claude都不曾或者是遗漏的,而且还有那么多点遗漏,想要真正要在企业生产级环境使用MCP是需要做分布式开发的…

TypeScript面试题集合【初级、中级、高级】

初级面试题 什么是TypeScript? TypeScript是JavaScript的超集,由Microsoft开发,它添加了可选的静态类型和基于类的面向对象编程。TypeScript旨在解决JavaScript的某些局限性,比如缺乏静态类型和基于类的面向对象编程&#xff0c…

无锡无人机驾驶证培训费用

无锡无人机驾驶证培训费用,随着科技的迅速发展,无人机在众多行业中发挥着举足轻重的作用。从影视制作到农业监测,再到物流运输与城市规划,无人机的应用场景不断扩展,因此越来越多的人开始意识到学习无人机驾驶技能的重…

2181、合并零之间的节点

2181、[中等] 合并零之间的节点 1、问题描述: 给你一个链表的头节点 head ,该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 ,请你将它们之间的所有节点合并成一个节点&#xff…

相机的曝光和增益

文章目录 曝光增益增益原理主要作用增益带来的影响增益设置与应用 曝光 参考:B站优致谱视觉 增益 相机增益是指相机在拍摄过程中对图像信号进行放大的一种操作,它在提高图像亮度和增强图像细节方面起着重要作用,以下从原理、作用、影响以…

小飞电视 2.7.0 | 高清秒播无卡顿的电视直播软件

小飞电视采用了流行的天光YY壳进行二次开发,内置了热门的肥羊源。更新后在加载速度和播放速度上有了显著提升,并提供了丰富的内容和各种分类栏目,包括4K和8K频道以及经典的直播内容如虎芽、斗鱼、歪歪等。该软件的最大特点是其稳定性和无广告…

【Python爬虫高级技巧】BeautifulSoup高级教程:数据抓取、性能调优、反爬策略,全方位提升爬虫技能!

大家好,我是唐叔!上期我们聊了 BeautifulSoup的基础用法 ,今天带来进阶篇。我将分享爬虫老司机总结的BeautifulSoup高阶技巧,以及那些官方文档里不会告诉你的实战经验! 文章目录 一、BeautifulSoup性能优化技巧1. 解析…

【愚公系列】《高效使用DeepSeek》055-可靠性评估与提升

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…

C# Winform 入门(12)之制作简单的倒计时

倒计时效果展示 控件展示 以下均是使用label来形成的 label 的 BorderStyle:Fixed3D ForeColor:Red Blackground:Black label 的属性 Name: txtyear txtmonth txtday txttime txtweek txtDays txtHour txtM…

edge webview2 runtime跟Edge浏览器软件安装包双击无反应解决方法

软件安装报错问题有需要远程文章末尾获取联系方式,可以帮你远程处理各类安装报错。 一 、edge webview2 runtime跟Edge浏览器软件安装包双击无反应 在安装edge webview2 runtime跟Edge浏览器双击无反应没有出现安装界面。这个可能是 新版本的Edge WebView2 Runti…