二叉树的前序遍历、中序遍历、后序遍历

news2024/11/27 15:55:20

在这里插入图片描述


二叉树的前序遍历、中序遍历、后序遍历

  • 一、递归算法的三个要素
  • 二、144. 二叉树的前序遍历
  • 三、94. 二叉树的中序遍历
  • 四、145. 二叉树的后序遍历

一、递归算法的三个要素

1、确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
2、确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
3、确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

递归遍历是深度优先遍历,一个方向上递归,当遇到空节点的时候,往上返回

二、144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
在这里插入图片描述
在这里插入图片描述

以前序遍历为例:
1、确定递归函数的参数和返回值:因为要打印出前序遍历节点的数值,所以参数里需要传入res来放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返回值,代码如下:

def func(self, root):
    res = []

2、确定终止条件:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要结束了,所以如果当前遍历的这个节点是空,就直接return,代码如下:

if node is None:
   return

3、确定单层递归的逻辑:前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下:

res.append(node.val)
dfs(node.left)
dfs(node.right)

总体代码

class S:
    def func(self, root):
        res = []

        def dfs(node):
            if node is None:
                return
            res.append(node.val)
            dfs(node.left)
            dfs(node.right)

        dfs(root)
        return res

三、94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
在这里插入图片描述

class S1:
    def func(self, root):
        res = []

        def dfs(node):
            if node is None:
                return
            dfs(node.left)
            res.append(node.val)
            dfs(node.right)

        dfs(root)
        return res

四、145. 二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
在这里插入图片描述

class S2:
    def func(self, root):
        res = []

        def dfs(node):
            if node is None:
                return
            dfs(node.left)
            dfs(node.right)
            res.append(node.val)

        dfs(root)
        return res

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

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

相关文章

报错:AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

报错内容:AttributeError: module PIL.Image has no attribute ANTIALIAS 问题所在: 使用PIL读取图像后对其进行Resize时由于PIL 版本问题出现AttributeError: module PIL.Image has no attribute ANTIALIAS 具体的代码如下 resized_img img.resize(ta…

交换机与队列的介绍

1.流程 首先先介绍一个简单的一个消息推送到接收的流程,提供一个简单的图 黄色的圈圈就是我们的消息推送服务,将消息推送到 中间方框里面也就是 rabbitMq的服务器,然后经过服务器里面的交换机、队列等各种关系(后面会详细讲&…

【python】python的选择语句的三个题目

1.乘坐飞机时,有些航班没有行李额度,当乘客的行李小于等于20公斤时,按每公斤1.68元收费;大于20公斤时,按每公斤1.98元收费,编写程序计算收费情况(保留两位小数) air_bagfloat(input…

制药领域的技术革命:Profinet转CanOpen网关大放异彩

在科技飞速发展的今天,制药行业正采用更先进的配置方式,以提升生产效率。对于制药行业来说,生产环节中涉及到的各种设备、系统和流程需要高效协同,而这正是Profinet转CanOpen网关所能提供的价值所在。Profinet转CanOpen网关作为一…

X服务器远程连接问题解决:Bad displayname ““‘或Missing X server or $DISPLAY

X服务器远程连接问题 报错1 ImportError: this platform is not supported: (failed to acquire X connection: Bad displayname "", DisplayNameError()) Try one of the following resolutions: * Please make surethat you have an X server running, and that …

反射(Reflection) --Java学习笔记

反射 反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等) 反射学什么? 学习获取类的信息、操作它们 反射第一步:加载类,获取类的字节码:Class对象获取类的构造器:Constructor对象获取类的成员变量:Field对象获取类的成…

利用vivid包,点亮机器学习模型图:惊艳的可视化新体验

一、引言 随着大数据时代的到来,机器学习技术在各个领域得到了广泛的应用。然而,由于机器学习模型的复杂性和抽象性,理解和解释这些模型往往是一项挑战。因此,机器学习可视化成为了连接数据和模型理解之间的桥梁,具有至…

DP:子数组模型

一、最大子数组和 . - 力扣&#xff08;LeetCode&#xff09; 二、环形子数组的最大和 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxSubarraySumCircular(vector<int>& nums) {//动态规划思想解决 //环形数组问题&#xff0c;尝试转…

AIGC实战——StyleGAN(Style-Based Generative Adversarial Network)

AIGC实战——StyleGAN 0. 前言1. StyleGAN1.1 映射网络1.2 合成网络1.3 自适应实例归一化层1.4 风格混合1.5 随机变化 2. StyleGAN 生成样本3. StyleGAN23.1 权重调制与解调3.2 路径长度正则化3.3 非渐进式增长 4. StyleGAN2 生成样本小结系列链接 0. 前言 StyleGAN (Style-Ba…

STM32F4 IAP跳转APP问题及STM32基于Ymodem协议IAP升级笔记

STM32F4 IAP 跳转 APP问题 ST官网IAP例程Chapter1 STM32F4 IAP 跳转 APP问题1. 概念2. 程序2.1 Bootloader 程序 问题现象2.2. APP程序 3. 代码4. 其他问题 Chapter2 STM32-IAP基本原理及应用 | ICP、IAP程序下载流程 | 程序执行流程 | 配置IAP到STM32F4xxxChapter3 STM32基于Y…

linux-docker安装nginx

1.拉取镜像&#xff1a; docker pull nginx2.创建挂在路径&#xff1a; mkdir -p /usr/local/nginx/conf mkdir -p /usr/local/nginx/logs mkdir -p /usr/local/nginx/www mkdir -p /usr/local/nginx/conf.d 3.启动镜像:为了拿到位置文件&#xff0c;先启动下 docker run -…

本地项目提交 Github

工具 GitIdeaGithub 账号 步骤 使用注册好的 Github 账号&#xff0c;登陆 Github&#xff1b; 创建 Repositories (存储库)&#xff0c;注意填写图上的红框标注&#xff1b; 创建完成之后&#xff0c;找到存储库的 ssh 地址或 https 地址&#xff0c;这取决于你自己的配置…

linux网络知识

七层模型 应用层 为操作系统或者网络应用程序提供网络服务的接口 表示层 解决不同系统之间的通信问题&#xff0c;负责数据格式的转换 会话层 自动收发包&#xff0c;自动寻址&#xff0c;负责建立和断开连接 传输层 将上层数据分段并提供端到端的…

Qt/C++推流组件使用说明

2.1 网络推流 公众号&#xff1a;Qt实战&#xff0c;各种开源作品、经验整理、项目实战技巧&#xff0c;专注Qt/C软件开发&#xff0c;视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。 公众号&#xff1a;Qt入门和进阶&#xff0c;专门介绍Qt/C相关知识点学…

17. 【Android教程】开关控件ToggleButton/Switch

本节要学的两个控件是我们在使用 Android 手机时经常会用到的&#xff0c;相信大家对它并不陌生&#xff0c;甚至是非常熟悉&#xff0c;但是现实是很多开发者并不了解开关控件&#xff0c;所以会花不少功夫通过 TextView 或 Button 来实现开关功能&#xff0c;殊不知 Android …

CSS 实现无限波浪边框卡片

CSS 实现无限波浪边框卡片 效果展示 鼠标悬停效果&#xff0c;底部色块的边框是无限滚动的波浪 鼠标没有悬停效果 CSS 知识点 CSS 基础知识回顾使用 radial-gradient 实现波浪边框使用 anumate 属性实现波浪边框动画和控制动画运动 波浪实现原理 波浪边框的实现思路其…

【产品】ADW300 无线计量仪表 用于计量低压网络的三相有功电能

1 概述 ADW300 无线计量仪表主要用于计量低压网络的三相有功电能&#xff0c;具有体积小、精度高、功能丰富等优点&#xff0c;并且可选通讯方式多&#xff0c;可支持 RS485 通讯和 Lora、2G、NB、4G 等无线通讯方式&#xff0c;增加了外置互感器的电流采样模式&#xff0c;从…

day6 nest商业项目初探·二(java转ts全栈/3R教室)

背景&#xff1a;今天看3r教室开放的这个项目 【美国 | 3.6w】TS全栈&#xff1a;Goflashdeals代购返利网站 &#xff08;2022.09&#xff09; - 3R酷 | 爱自由,不打工&#xff01;一个属于3R会员的社区 (3rku.com)省流&#xff1a;web程序起来了&#xff0c;admin没起来&#…

CUDA 12.4文档2 内核线程架构

本博客参考官方文档进行介绍&#xff0c;全网仅此一家进行中文翻译&#xff0c;走过路过不要错过。 官方网址&#xff1a;https://docs.nvidia.com/cuda/cuda-c-programming-guide/ 本文档分成多个博客进行介绍&#xff0c;在本人专栏中含有所有内容&#xff1a; https://bl…

分享|如何知道自己是不是大数据信用黑名单?

随着大数据技术在金融贷前审核环节中的运用&#xff0c;早在多年前都形成了大数据信用&#xff0c;大数据信用作为辅助的风控工具&#xff0c;作用变得十分重要&#xff0c;其中大数据黑名单就是大数据差的重要一种&#xff0c;那如何知道自己是不是大数据信用黑名单呢?本文详…