Leetcode刷题4

news2024/11/27 6:39:45

⼆叉树、BFS、堆、Top K、⼆叉搜索树、模拟、图算法

一、二叉树 

二叉树的前序中序后序

二叉树节点定义
为了方便演示,我们先定义一个二叉树节点类。

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

前序遍历

前序遍历的顺序是先访问根节点,再遍历左子树,最后遍历右子树。可以用递归实现前序遍历,也可以用来实现。

递归

def preorderTraversal(root: TreeNode) -> List[int]:
    res = []

    def dfs(node):
        if not node:
            return
        res.append(node.val)
        # 先左后右
        dfs(node.left)  
        dfs(node.right)

    dfs(root)
    return res

def preorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []

    res = []
    stack = [root]

    while stack:
        node = stack.pop()
        res.append(node.val)

        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)

    return res

中序遍历

中序遍历的顺序是先遍历左子树,再访问根节点,最后遍历右子树。同样可以用递归或者栈来实现。

递归

def inorderTraversal(root: TreeNode) -> List[int]:
    res = []

    def dfs(node):
        if not node:
            return
        # 先左 再访问 最后右
        dfs(node.left)
        res.append(node.val)
        dfs(node.right)

    dfs(root)
    return res

def inorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []

    res = []
    stack = []

    while stack or root:
        while root:
            stack.append(root)
            root = root.left

        node = stack.pop()
        res.append(node.val)
        root = node.right

    return res

后序遍历

后序遍历的顺序是先遍历左子树,再遍历右子树,最后访问根节点。同样可以用递归或者栈来实现。

递归

def postorderTraversal(root: TreeNode) -> List[int]:
    res = []

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

    dfs(root)
    return res

def postorderTraversal(root: TreeNode) -> List[int]:
    if not root:
    	return []

	res = []
	stack = [root]
	
	while stack:
	    node = stack.pop()
	    res.append(node.val)
	
	    if node.left:
	        stack.append(node.left)
	    if node.right:
	        stack.append(node.right)
	
	return res[::-1]

需要注意的是,栈实现后序遍历的时候,先遍历右子树再遍历左子树,然后将结果反转即可。

102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root is None:
            return []
        ans = []
        cur = [root]
        while cur:
            vals = []
            nxt = []
            for node in cur:
                vals.append(node.val)
                if node.left:  nxt.append(node.left)
                if node.right: nxt.append(node.right)
            cur = nxt
            ans.append(vals)
        return ans

优化,使用队列,保证当前cur中只保存待取的节点,那么每次访问完后就剔除队列即可。左出右进(先进先出) 

class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root is None:
            return []
        ans = []
        q = deque([root])
        while q:
            vals = []
            for _ in range(len(q)):
                node = q.popleft()
                vals.append(node.val)
                if node.left:  q.append(node.left)
                if node.right: q.append(node.right)
            ans.append(vals)
        return ans

 先保存根节点,然后先提取根节点的值,然后只要左右不为空就加到nxt中,待cur中的节点访问完毕后,把新的nxt赋值给cur,继续循环。

103. 二叉树的锯齿形层序遍历

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

class Solution:
    def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root is None:
            return []
        ans = []
        cur = [root]
        even = False
        while cur:
            nxt = []
            vals = []
            for node in cur:
                vals.append(node.val)
                if node.left:  nxt.append(node.left)
                if node.right: nxt.append(node.right)
            cur = nxt
            # 奇数层不变,偶数层翻转
            ans.append(vals[::-1] if even else vals)
            even = not even
        return ans

105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if not preorder or not inorder:  # 递归终止条件
            return
        root = TreeNode(preorder[0])  # 先序为“根左右”,所以根据preorder可以确定root
        idx = inorder.index(preorder[0])  # 中序为“左根右”,根据root可以划分出左右子树
        # 下面递归对root的左右子树求解即可
        root.left = self.buildTree(preorder[1:1 + idx], inorder[:idx])
        root.right = self.buildTree(preorder[1 + idx:], inorder[idx + 1:])
        return root

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

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

相关文章

keil5汇编实现1-100累加

.text 用于声明下面的代码都存放在.text文本段 .globl _start 声明_start代码内容属于全局内容_start: 汇编语言的标签,类似于c语言中的函数mov r0,#0 总和mov r1,#1 比较累加的值,次数bl fun 跳转,下一个指令地址保存到lr中cmp r1,#…

LLM微调 | LoRA: Low-Rank Adaptation of Large Language Models

🔥 发表于论文:(2021) LoRA: Low-Rank Adaptation of Large Language Models 😄 目的:大模型预训练微调范式,微调成本高。LoRA只微调新增的小部分参数。 文章目录 1、背景2、动机3、LoRA原理4、总结 1、背景 adapter…

【UE4 塔防游戏系列】11-多种类型敌人

目录 效果 前言 步骤 一、创建多种不同类型敌人 二、创建波次 (修改游戏模式) 效果 前言 我们之前使用的敌人都是同一种敌人,都是名为“Crossbowman”敌人 这里我们根据(【UE4 塔防游戏系列】03-创建第一个敌人&#xff09…

学会在重装系统前如何备份软件,再也不怕失去珍贵的应用!

​Windows系统是电脑的重要组成部分,它不仅提供了友好的用户界面,还承担着许多关键的功能和任务,为我们提供了一个稳定、安全和效率的工作环境,使我们能够充分发挥电脑的潜力,优化工作效率和生活品质。 随着系统使…

软件测试面试及笔试题

1、什么是软件测试? 【要点】 在规定条件下对程序进行操作,以发现错误,对软件质量进行评估,包括对软件形成过程的文档、数据以及程序进行测试。 【详解】 软件测试就是在软件投入运行前对软件需求分析、软件设计规格说明书和软…

网络安全/黑客技术—学习笔记

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…

【产品经理】小型团队通用工作流程SOP方案

:所谓SOP,即标准作业程序,指将某一事件的标准操作步骤和要求以统一的格式描述出来,用于指导和规范日常的工作。实际执行过程中sop核心是符合本企业并可执行,不流于形式。 一、跨部门工作流程 跨部门流程及职能如下图展…

2.6Checkbutton勾选项

2.6Checkbutton勾选项 运行之后的效果将会像下面的图片一样,此时不作任何操作. 如果只选中第一个选项,即图中的python, 效果就会如下. 如果只选中第二个选项,即图中的c, 效果就会如下. 如果两个选项都选中, 效果就会如下. Checkbutton部…

2023年7月22日(星期六):骑行海囗

2023年7月22日(星期六):骑行海囗,早8:30到9:00, 大观公园门囗集合,9:30点准时出发 【因迟到者,骑行速度快者,可自行追赶偶遇。】 偶遇地点: 大观公园门囗集合,家住南,东&#xff0…

【第11天】面向对象程序设计_对象的创建,使用,继承

对象的创建及应用 对象的创建 对象可以认为是在一类事物中抽象出某一个特定通过这个特例来处理这类事物出现的问题。在程序语言中通过new关键字来创建对象。前文在讲解构造函数时介绍过每实例化一个对象就会自动调用一次构造函数,实质上这个过程就是创建对象的过程…

实例018 类似windows xp的程序界面

实例说明 在Windows XP环境下打开控制面板,会发现左侧的导航界面很实用。双击展开按钮,导航栏功能显示出来,双击收缩按钮,导航按钮收缩。下面通过实例介绍此种主窗体的设计方法。运行本例,效果如图1.18所示。 ​编辑…

C++ vector容器注意事项

容量(capacity)和大小(size)的区别 vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数;而 vector 容器的大小&#xff…

如何提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二、ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号与…

zabbix监控linux主机、监控windows10主机

目录 一、环境准备 1、关闭防火墙 2、准备三台服务器、添加主机声明 3、修改主机名 4、此篇接着上一篇zabbix监控自己的环境下操作,server(192.168.147.135)已经配置好 二、源码安装zabbix 1、下载包、安装依赖包、联网同步清华时间 2…

vue3组件中使用live2d看板娘(仰望星空的sun)

文章目录 前言思路和实现步骤以及遇到的问题原文章地址My备份Git 相关问题問題解決解決index.html中正常放入canvas問題 前言 因为上个官方包版的canvas总是不能按理想状态更好的控制,渲染在vue中,所以我依然想参考“仰望星空的sun”大佬的笔记以及git开…

Echarts 修改背景颜色、全屏自适应屏幕

修改背景色: 全屏自适应屏幕 首先拿到外面的div的高度 通过DOM获取clientHeight即为无论全屏与否都是DIV的整个高度 在通过高度去做自适应就好了

Spring Boot Helper插件免费版的下载

在使用idea的社区版的时候,我们创建springboot项目就要下载springboot helper插件,下载是很简单,但是呢,有一个问题就是: 可以看到它是收费的,要想免费创建spring boot项目那么我们第一可以采用网页版创建&…

纯干货!!!Java后端技术清单(附图)

分享一份最新的Java后端开发技能清单,可根据自身情况以及岗位招聘要求做动态调整,核心思想就是尽可能满足岗位招聘的所有技能要求。 Java后端技术清单: 1.计算机基础:熟练掌握计算机网络、数据结构和算法、操作系统,了解计算机组成原理。 …

❤️创意网页:制作一个绚丽的烟花效果(HTML、CSS和JavaScript实现)

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

Hutool——国产良心工具包,让你的java变得更甜

目录 1. 基础工具 1.1 日期时间处理 1.2 I/O 1.3 字符串处理 1.4 集合框架 1.5 常见业务 2. 定时任务 3. 验证码 4. 缓存 5. Excel操作 6. Http请求 7. 加密 7.1 加密和解密 7.2 签名和验签 8. 其他说明 8.1 引入Hutool Hutool是国内程序员在工作中总结和积累而…