【Leetcode 剑指Offer】第 6 天 搜索与回溯算法(简单)

news2025/4/8 11:29:18

搜索与回溯

    • 剑指 Offer 32 - I. 从上到下打印二叉树
      • 层序遍历 广搜 BFS
        • collections
        • 双端队列 deque
    • 剑指 Offer 32 - II. 从上到下打印二叉树 II
    • 剑指 Offer 32 - III. 从上到下打印二叉树 III

剑指 Offer 32 - I. 从上到下打印二叉树

题;从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
在这里插入图片描述

层序遍历 广搜 BFS

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
        if not root:return []
        res,queue=[], collections.deque()
        queue.append(root)#先加入一个根节点
        while queue:
            node=queue.popleft()#
            res.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        return res

'''
Q:完整的输入输出如何实现?

'''

#!希望后续补充实现完整输入输出!!

复杂度分析:
时间复杂度 O(N) : N为二叉树的节点数量,即 BFS 需循环 N 次。
空间复杂度 O(N): 最差情况下,即当树为平衡二叉树时,最多有 N/2个树节点同时在 queue 中,使用 O(N)大小的额外空间。

collections

作为 Python 的内建集合模块,实现了许多十分高效的特殊容器数据类型在这里插入图片描述

双端队列 deque

在这里插入图片描述
append():从右端添加元素,与list相同
appendleft():从左端添加元素

extend():从右端逐个添加可迭代对象,与list相同,Python中的可迭代对象有:列表、元组、字典、字符串

extendleft():

pop():移除列表中的一个元素(默认最右端的一个元素),并且返回该元素的值(与list同),如果没有元素,将会报出IndexError
popleft():

count():统计队列中的元素个数(与list同)
insert(index,obj):在指定位置插入元素(与list同)
rotate(n): 从右侧反转n步,如果n为负数,则从左侧反转。
d.rotate(1) 等于 d.appendleft(d.pop())

maxlen:只读的属性,deque限定的最大长度,如果无,就返回None。
当限制长度的deque增加超过限制数的项时, 另一边的项会自动删除。
remove():移除第一次出现的元素,如果没有找到,报出ValueError
clear():将deque中的元素全部删除,最后长度为0

剑指 Offer 32 - II. 从上到下打印二叉树 II

题 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

思考:
BFS 循环: 当队列 queue 为空时跳出;
新建一个临时列表 tmp ,用于存储当前层打印结果;
当前层打印循环: 循环次数为当前层节点数(即队列 queue 长度);
出队: 队首元素出队,记为 node;
打印: 将 node.val 添加至 tmp 尾部;
添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
将当前层结果 tmp 添加入 res 。

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:return []
        res,queue=[], collections.deque()
        queue.append(root)#先加入一个根节点
        while queue:
            tmp=[]
            for i in range(len(queue)):
                node=queue.popleft()
                tmp.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)                
            res.append(tmp)
        return res

复杂度分析:
时间复杂度 O(N)。
空间复杂度 O(N)。
代码参考:https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/solutions/137255/mian-shi-ti-32-ii-cong-shang-dao-xia-da-yin-er-c-5/

剑指 Offer 32 - III. 从上到下打印二叉树 III

题 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

思考:这题直接设一个数字标注层数是奇是偶,对应给tmp[]逆序是不可以的,因为后序层遍历的顺序会变!!

所以应将主要程序重复,但是一个先左后右,一个先右后左,中间记得判断是否空了;
或者tmp也是双端队列,第一个点放入tmp,如果当前是偶数层,下一个点从左边插入最后append到res中时记得把tmp转为list【如下面代码】

#按层数奇偶
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:return []
        res,queue=[], collections.deque()
        queue.append(root)#先加入一个根节点
        while queue:
            tmp=collections.deque()
            for i in range(len(queue)):
                node=queue.popleft()#第一个点先放进去
                if len(res)%2==1:#此层是偶数层,节点往左边插入
                    tmp.appendleft(node.val)
                else:tmp.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)           
            res.append(list(tmp))
        return res

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

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

相关文章

单通道说话人语音分离——DPRNN(Dual-Path Recurrent Neural Network)

参考文献:《DUAL-PATH RNN: EFFICIENT LONG SEQUENCE MODELING FOR TIME-DOMAIN SINGLE-CHANNEL SPEECH SEPARATION》 DPRNN网络是Con-Tasnet的改进网络 Con-Tasnet介绍详情请看上一篇文章 单通道说话人语音分离——Conv-TasNet(Convolutional Time-domain audio…

应用程序性能优化方案,web服务五级缓存优化,服务器性能优化...

winfrom 全局异常捕获WPF 全局异常捕获Asp.Net全局异常捕获MVC 全局异常捕获AspNetNetCore 全局异常捕获一级缓存html/css/js 前端缓存二级缓存Asp.Net MVC AspNetCore 客户端缓存设置三级缓存服务端缓存四级redis 数据库缓存服务端缓存五级sqlserver 数据库缓存设置分布式缓存…

2023年湖北建设厅资料员证怎么考需要什么条件?启程别

2023年湖北建设厅资料员证怎么考需要什么条件?启程别 湖北资料员目前已经开始组织考试了,各位想要考资料员的现在可以开始准备报考相关准备工作了。资料员怎么考需要什么条件?启程别告诉你 建设厅资料员证怎么考 网报:七大员全国…

ARM学习(十八)jinkozone调试问题总结

笔者来聊聊ARM的函数的调用规则 1、ARM函数调用规则介绍首先介绍几个术语, AAPCS:Procedure Call Standard for the ARM Architecture APCS:ARM Procedure Call Standard TPCS:Thumb Procedure Call Standard ATPCS:AR…

5.3 redis分布式锁【Java 面试第三季】

redis分布式锁【Java 面试第三季】前言推荐redis分布式锁概览47_redis分布式锁前情说明48_boot整合redis搭建超卖程序-上49_boot整合redis搭建超卖程序-下50_redis分布式锁0151_redis分布式锁0252_redis分布式锁0353_redis分布式锁0454_redis分布式锁0555_redis分布式锁0656_re…

【Java|golang】2363. 合并相似的物品---桶排序

给你两个二维整数数组 items1 和 items2 ,表示两个物品集合。每个数组 items 有以下特质: items[i] [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ,weighti 表示第 i 件物品的 重量 。 items 中每件物品的价值都是 唯一的 。 请你…

报名投票链接怎么做做一个投票的链接怎么做微信投票链接怎么做

近些年来,第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放,更多人选择微信投票小程序平台,因为它有非常大的优势。1.它比起微信公众号自带的投票系统、传统的H5投票系统有可以图…

案例|政务大数据平台数据安全建设实践

《关于加强数字政府建设的指导意见》、《全国一体化政务大数据体系建设指南》,对全面开创数字政府建设新局面作出部署,保障数据安全,提升数字政府基础设施的支撑能力,也明确成为数字政府建设探索与实践中的重点任务。那么&#xf…

王道计算机网络课代表 - 考研计算机 第五章 传输层 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 计算机网络 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “传输层” 章节知识点总结的十分全面,涵括了《计算机网络》课程里的全…

klee内存模型

klee内存模型一.LLVM基础二.Klee中相关的类2.1.基础类2.2.内存管理相关类三.示例3.1.示例13.2.示例23.3.示例33.4.示例4这篇blog主要通过一些简单的示例来了解以下klee对内存的建模方式。 首先一个C语言程序在运行时,内存主要包括: 代码段,程…

如何从零到一的设计一套轻易云数据集成平台这样的系统架构

一个集成平台的架构设计需要考虑多个方面,包括系统架构、技术选型、数据存储、安全设计等。下面是参考轻易云数据集成平台的架构设计思路:系统架构首先需要确定系统的整体架构,这包括前后端分离、微服务架构、容器化部署等。根据需求和规模的…

老字号白酒企业——金徽酒借力泛微,升级门户,实现统一办公

金徽酒股份有限公司前身系康庆坊、万盛魁等多个徽酒老作坊基础上组建的省属国营大型白酒企业,曾用名甘肃陇南春酒厂,是国内建厂最早的中华老字号白酒酿造企业之一。2016年3月10日,金徽酒在上海证券交易所挂牌上市。 (图片素材来自…

Airbnb(三) Managing Diversity in Airbnb Search 搜索多样性

abstract 搜索系统中一个长期的问题是结果多样性。从产品角度讲,给用户多种多样的选择,有助于提升用户体验及业务指标。 多样性需求和模型的目标是相矛盾的,因为传统ctr模型是 point wise,只看单个相关性不管相邻之间item差异。 …

字节前端一面常见vue面试题(必备)

Vue为什么没有类似于React中shouldComponentUpdate的生命周期 考点: Vue的变化侦测原理前置知识: 依赖收集、虚拟DOM、响应式系统 根本原因是Vue与React的变化侦测方式有所不同 当React知道发生变化后,会使用Virtual Dom Diff进行差异检测,但是很多组件…

如何顺利渡过三月“大考”?ScanV为您献上“通关秘籍”

随着网络安全形势日益复杂、严峻,在重大安全保障事件期间,重要业务系统,尤其是党政机关、国企央企、能源、金融等重要的关基单位更应重视网站及业务系统安全。 临近三月重保季,知道创宇推出“御黑行动-典型案例篇”,以…

美国近50%的企业都在使用ChatGPT!你的企业用了吗?

当一些人还在尝试向人工智能聊天程序ChatGPT提问、和它进行沟通交流时,不少美国企业已把ChatGPT应用到了日常工作中,甚至代替了部分员工,节省了企业成本。据美国《财富》杂志网站近日报道,本月早些时候,一家提供就业服…

王道计算机网络课代表 - 考研计算机 第四章 网络层 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 计算机网络 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “网络层” 章节知识点总结的十分全面,涵括了《计算机网络》课程里的全…

HTML标签——表格标签

HTML标签——表格标签 目录HTML标签——表格标签一、表格标题和表头单元格标签场景:注意点:案例实操小结二、表格的结构标签场景:注意点:案例实操:三、合并单元格思路场景:代码实现一、表格标题和表头单元格…

今天,我想去一个平行世界

基于云计算的大规模即时云渲染技术,让每个人都拥有了“数字生命”。2023的开年爆款,非《流浪地球2》莫属。 它展开了人类的新话题,关于平行空间,关于数字生命,关于人类文明。跟随这部科幻巨作,穿越平行空间…

hadoop-Yarn资源调度器【尚硅谷】

大数据学习笔记 Yarn资源调度器 Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行与操作系统之上的应用程序。 (也就是负责MapTask、ReduceTask等任…