代码随想录算法训练营第14天 |● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代

代码随想录算法训练营Day13 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代、层序遍历 阅读详情


前言

理论基础

需要了解 二叉树的种类,存储方式,遍历方式 以及二叉树的定义
记录我容易忘记的点
在这里插入图片描述
在这里插入图片描述
题目一半都是用链式存储来做,但是可以稍微了解一下顺序存储
在这里插入图片描述
定义的代码
在这里插入图片描述
在这里插入图片描述

二叉树的递归遍历

前中后分别对应力扣的144,94,145

💖递归算法基本要素

这个主要用于打基础,后面所有二叉树的题目都需要用这个来做。
这里帮助大家确定下来递归算法的三个要素。每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!

确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

代码

dfs函数可以写在里面,不用额外写一个self.dfs在外面

class Solution(object):

    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        vec = []
        def dfs(node):
            if not node:
                return
            vec.append(node.val)
            dfs(node.left)
            dfs(node.right)
        dfs(root)
        return vec
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        vec = []
        def dfs(node):
            if not node:
                return
            
            dfs(node.left)
            vec.append(node.val)
            dfs(node.right)
        dfs(root)
        return vec 
            def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        vec = []
        def dfs(node):
            if not node:
                return
            dfs(node.left)            
            dfs(node.right)
            vec.append(node.val)
        dfs(root)
        return vec        

迭代遍历-需要先理清思路再写

为什么有了递归还要迭代:因为面试的时候有可能会问你能不能用除了递归别的方法。

递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。

此时大家应该知道我们用栈也可以是实现二叉树的前后中序遍历了。【看动图过程】

前向迭代法

根左右
首先根节点入栈,然后紧跟着弹出给到result数组里面,然后压入右节点和左【先右再左是为了出栈顺序是左右】

  • 也就是压入一个根节点之后,弹出,紧跟着再压入它的左右两个节点;到下一轮循环里面,弹出根节点,然后再压入它的右左节点;
    在这里插入图片描述

在这里插入图片描述
if not root: return : 这一行代码不要忘了,有可能传入的root是空的。

    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """

        # 非迭代法
        if not root: return
        result = []
        stack =[root]
        while stack:#如果还有节点:
            node = stack.pop()
            result.append(node.val)
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
        return result

后序迭代

左右根
在这里插入图片描述

只需要对先序做两个调整:交换左右,reverse result数组

    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
                # 代法
        if not root: return
        result = []
        stack =[root]
        while stack:#如果还有节点:
            node = stack.pop()
            result.append(node.val)
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        return result[::-1]

中序迭代

思路:根节点一路压栈,知道左节点为空之后,弹出该节点【已经判断了左(为空)和中(弹出)】,然后判断右节点,不为空就压入右节点,判断这个右节点;为空的话就弹出栈口的节点,再判断新弹出的右节点是否为空;

  • 左节点为空之后,就从栈弹出中间节点然后判断右节点【从栈顶弹出的元素是最近访问的元素 】
    具体实现:加了一个指针curr
    在这里插入图片描述

错的地方都写了注释

# 中序遍历-迭代-LC94_二叉树的中序遍历
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:#这个别忘了
            return []
        stack = []  # 不能提前将root结点加入stack中
        result = []
        cur = root
        while cur or stack:#如果cur和stack都是空的话
            # 先迭代访问最底层的左子树结点
            if cur:     
                stack.append(cur)#压入的是node啊,别写成val了
                cur = cur.left		
            # 到达最左结点后处理栈顶结点    
            else:		
                cur = stack.pop()
                result.append(cur.val)
                # 取栈顶元素右结点
                cur = cur.right	
        return result

迭代法统一写法

没看。carl说这个思路有点抽象,而且面试的时候很难一下子写对,就算了吧。我也没看懂。。。。

总结

晚上无论如何也要把实习简历写一半。所以不磕了

TOGAF9.2/10 认证基础知识点概览表 (考点解析:业务场景是一种重要的技术,可以在企业架构的各个阶段使用,主要是架构愿景和业务架构,但如果需要,也可以在其他架构域中使用,以直接从业务的高级需求中派生架构的特征。“哪里”可以看作是对相关企业的界定、“为什么”可以被视为组织环境中的关键驱动因素和要素、“谁”是指确定发起人利益相关者和受业务指令影响的其他主要利益相关者,以创建企业架构,并确定他们来自企业的需求和优先级、他们与企业的关系以及彼此之间所需的工作行为。它是业务驱动和业务主导的,它结 合了所有业务线的必要努力,以实现所需的能力。 阅读详情

相关推荐

UE5实战:用Cesium插件打造逼真湖泊效果(附波纹参数调优技巧)

本文详细介绍了在Unreal Engine 5中利用Cesium插件创建逼真区域水效果(如湖泊)的实战流程。重点解析了通过材质层混合机制,精细调整波纹参数(如DistanceScale、NearScale)来模拟不同水体状态,并提供了从资产创建、地形配置到视觉调优的一站式解决方案,帮助开发者高效实现非海洋水域的动态视觉效果。

weixin_29209805的博客 160

代码随想录算法训练营第14天|●理论基础● 递归遍历 ● 迭代遍历● 统一迭代

int val;Node left;Node right;

weixin_74408291的博客 1283

Vmware虚拟机克隆详解:固定ip + 修改uuid等内容

分两大步 设置固定ip 克隆后修改相关配置 本文引用的其他地方的图片。会附上链接 若侵权,删 一、设置静态ip 先进行虚拟网络的编辑 接下来的操作需要管理员权限。(给权限就完事了) 接下来设置网卡: 网络和共享中心→ 更改适配器设置→VMware Network Adapter VMnet8 -> 右键属性 修改TCP/Ipv4的配置,网上常见是这种,笔者是英文的...

Unknownfuture的博客 9070

代码随想录算法训练营第14天 | ● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代

题目链接/文章讲解/视频讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html。【看后想法】使用空指针来区分栈中访问的处理结点的想法,很巧妙。【第一想法与实现(困难)】直接想是想不到统一迭代的方式的,迭代方法,要注意,遍历的时候,是否同时做处理,【链接】(文章,视频,题目)【链接】(文章,视频,题目)【链接】(文章,视频,题目)

henry87653的博客 386

数值天气预报期末复习

数值天气预报期末复习

m0_60394632的博客 7681

西安交通大学SQ轴承数据集(文末附数据)

西安交通大学SQ轴承数据集

qq_43271683的博客 1万+

代码随想录算法训练营第14天|理论基础● 递归遍历 ● 迭代遍历● 统一迭代

需要一个指针,指向访问的,栈用来确定处理的,此时访问的和处理的不一样(前序后序对root访问即处理,访问和处理是一样的,不需要等子节点完成再处理)先访问root,但不能,要依次走左,直到最左,弹出最左,处理最左,找右,继续弹出次左,处理次左,找右。弹出root,处理root,先押right,后押left,这样先弹出left后弹出right。后序也不用颠倒了,按照栈的先入后出,先把root压进去,且到root的时候就该处理了。二叉树的前中后序遍历,看的是中间root节点的处理顺序。

sinat_31325467的博客 208

数字锁相环的原理与FPGA实现

数字锁相环是锁相环电路的全数字实现。锁相环电路能够实现对输入信号的相位进行跟踪,进而在噪声中提取纯净的有用信号。以上就是今天要讲的内容,本文简单地介绍了锁相环的原理,然后,在Vivado仿真平台上,通过verilog做仿真验证。最终仿真结果能够实现锁定,但锁定时间较长,表明参数仍可做调整。

weixin_45857378的博客 8510

代码随想录算法训练营第14天| ● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代

(补)(补)

mw_studio的博客 280

《自然语言处理实战入门》文本分类 ---- 使用词向量与SVM 进行文本分类

文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用这种学习得到的关系模型对 新的文档进行类别判断 。文本分类从基于知识的方法逐渐转变为基于统计 和机器学习的方法。

shiter编写程序的艺术 2388

语音识别:PyAudio、SoundDevice、Vosk、openai-whisper、Argos-Translate、FunASR(Python)

本文介绍了Python中常用的音频处理库PyAudio,详细解析了其核心功能、核心概念和典型工作流程。PyAudio是一个跨平台的音频I/O库,支持音频录制、播放、实时流处理和低延迟操作。核心概念包括PyAudio类(管理音频设备和流)和Stream类(代表音频流)。文章重点讲解了open()方法的关键参数、回调函数的使用方式以及典型的工作流程,包括设备查询、流配置和资源释放。PyAudio适用于需要实时音频处理的场景,如语音识别和音频效果处理。

算法工程师 706

代码随想录算法训练营第14天|● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代

简单给你二叉树的根节点 root ,返回它节点值的 前序 遍历。示例 1:[图片]输入:root = [1,null,2,3]输出:[1,2,3]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]示例 4:[图片]输入:root = [1,2]输出:[1,2]示例 5:[图片]输入:root = [1,null,2]输出:[1,2]进阶:递归算法很简单,你可以通过迭代算法完成吗?

嗝~~~~的博客 223

MTK(camera篇)Camera整体点亮

本文介绍了在MTK平台上添加新Camera Sensor的驱动开发流程。主要内容包括:1)MTK Camera采用HAL3架构,驱动层主要负责sensor电源控制和寄存器操作;2)详细说明了添加新sensor需要在多个文件中进行的修改,包括设备树配置、内核头文件、驱动列表、电源序列等;3)特别指出需要配置I2C地址表,并导入tuning文件和metadata文件以完善ISP处理流程。文章提供了完整的文件修改清单,涵盖了从内核层到HAL层的完整开发过程,为MTK平台Camera Sensor驱动开发提供了具体

weixin_49303682的博客 361

代码随想录算法训练营第14天 | 二叉树part01:●理论基础● 递归遍历 ● 迭代遍历● 统一迭代

用数组来存储的遍历:如果父节点的下标是 i,那么左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。递归前中后 容易(前:中左右,中:左中右,后:左右中,改那三行就行)前中后序 (迭代 iteration,递归 recursion)层序遍历(迭代 iteration,递归 recursion)统一我学了一遍之后,第二次(10天后)已能自己写出,下面是前序,其他俩只用把else里那几句顺序改变。前中后分开的我这一遍不准备掌握了,太麻烦。先往深走,遇到叶子节点再往回走。存储:链式存储,顺序存储。

weixin_51674457的博客 1032

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

代码随想录算法训练营Day12 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代

二叉树:基础理论、递归遍历、迭代遍历、统一迭代

宁愿过拟合不要欠拟合 2247

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

代码随想录算法训练营第13天 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代、层序遍历

刚刚我们说过了二叉树有两种存储方式顺序存储,和链式存储,顺序存储就是用数组来存,这个定义没啥可说的,我们来看看链式存储的二叉树节点的定义方式。int val;大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。这里要提醒大家要注意二叉树节点定义的书写方式。在现场面试的时候 面试官可能要求手写代码,所以数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。

程序员黄雷的博客 2739

代码随想录算法训练营Day 14|二叉树Part01|二叉树理论基础、递归遍历 、迭代遍历、统一迭代

前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树。下面这两棵树都是搜索树 又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 常用 通过指针把分布在各个地址的节点串联一起。 如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。 递归遍历 二叉树的前序遍历 二叉树的中序遍历 二叉树的后序遍历每次写递归,

m0_51759998的博客 1795

【代码随想录算法训练营Day14】144.二叉树的前序遍历;145.二叉树的后序遍历;94.二叉树的中序遍历;● 理论基础;● 递归遍历;● 迭代遍历;● 统一迭代

虽然前中后序遍历规律不一样,但走的路径都相同,只是打印顺序不同。🌰以中序遍历为例,前序遍历和后序遍历就是递归顺序不一样。后序需要添加弹出栈的条件。

Tammy2001的博客 1026

代码随想录算法训练营第十二天|理论基础,递归遍历,迭代遍历,统一迭代

链式存储的二叉树节点的定义方式:和链表差不多,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。

weixin_47748259的博客 1202

代码随想录算法训练营第十四天 | 二叉树理论基础、递归遍历 、迭代遍历、统一迭代

二叉树理论基础 递归遍历 迭代遍历 统一迭代

hewfhpiwjgjfw的博客 1482

代码随想录算法训练营第14天 | 理论基础 递归遍历 迭代遍历 统一迭代

int val;

Laulian的博客 1073

代码随想录算法训练营Day14 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代 | Python | 个人记录向

二叉树:理论基础、递归遍历、迭代遍历、统一迭代。

Python基本算法 1516

代码随想录训练营第14天|二叉树的理论基础、递归遍历、迭代遍历和统一遍历

第14天

qq_70244454的博客 1281

代码随想录算法训练营第十四天| 递归遍历 、迭代遍历、统一迭代

A入栈,看它有没有左孩子,有B则入栈,看B有没有左孩子有D入栈,看D有没有左孩子没有则D出栈访问它,看D有没有右孩子,没有则再次出栈,访问B,再看B的右孩子,右孩子E入栈,判断有没有左孩子,没有出栈访问E,判断有无右孩子,出栈访问A,判断A有无右孩子,C入栈,判断它有无左孩子,出栈访问它,判断有无右孩子没有则结束。与前序遍历类似,前序遍历是先访问,在入栈,这个是先入栈,在转到其左孩子,为空则出栈访问,不为空则访问左孩子再出栈访问它,再访问它的有孩子。1.沿着根节点的左孩子,依次入栈,直到左孩子为空。

weixin_48369273的博客 1696

代码随想录算法训练营第14天| 二叉树的理论基础| 递归遍历| 迭代遍历| 统一迭代

链式存储的二叉树节点的定义方式。int val;说到二叉树,就不得不说递归。递归遍历背景:(必须掌握)二叉树的三种递归遍历掌握其规律后,其实很简单代码随想录做题初始状态:算是二刷,思路上有点模糊的印象学完后想法:简单思路关键点:1.确定递归函数的参数返回值2.确定终止条件3.确定单层递归的逻辑今日收获+学习时长:复习了递归思路。学习时长,40min。

weixin_64048829的博客 1218

代码随想录算法训练营第十四天|二叉树理论基础、递归遍历、迭代遍历、统一迭代

链式存储int val;

Demok123的博客 931

代码随想录算法训练营day21

今天是算法营的第21天,希望自己能够坚持下来!今日任务:● 669. 修剪二叉搜索树● 108. 将有序数组转换为二叉搜索树● 538. 把二叉搜索树转换为累加树二叉树终于结束了!二叉树的递归:1.确定递归函数的参数 2.确定终止条件 3.单层递归逻辑二叉树的遍历方式:前序遍历(中左右),中序遍历(左中右),后序遍历(左右中)二叉树的迭代法,前序和后序相似,使用栈来存放需要处理的节点;而中序的栈是存放指针访问的节点,向左访问到最底层,再弹出节点进行处理,再向右访问。

qq_38365428的博客 1942
上一篇: 代码随想录算法训练营第13天|● 239. 滑动窗口最大值 ● 347.前 K 个高频元素
下一篇: 盲超分辨:Unsupervised Real-world Image Super Resolution via Domain-distance Aware Training和FSSR记录
Xalileetcode
博客等级 码龄7年 482粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值