Leetcode面试经典150题刷题记录 —— 二叉树层次遍历篇

Leetcod面试经典150题刷题记录-系列
Leetcod面试经典150题刷题记录——数组 / 字符串篇
Leetcod面试经典150题刷题记录 —— 双指针篇
Leetcod面试经典150题刷题记录 —— 矩阵篇
Leetcod面试经典150题刷题记录 —— 滑动窗口篇
Leetcod面试经典150题刷题记录 —— 哈希表篇
Leetcod面试经典150题刷题记录 —— 区间篇
Leetcod面试经典150题刷题记录——栈篇
Leetcod面试经典150题刷题记录——链表篇
Leetcod面试经典150题刷题记录——二叉树篇
Leetcod面试经典150题刷题记录——二叉树层次遍历篇
Leetcod面试经典150题刷题记录——二叉搜索树篇

二叉树层次遍历篇

    • 1. 二叉树的右视图
    • 2. 二叉树的层平均值
    • 3. 二叉树的层序遍历
    • 4. 二叉树的锯齿形层序遍历

在二叉树的传统里,用p指代左子树,用q指代右子树,这个原因是为什么呢?我以为,将pq两个字母里的圈圈视作节点,p那一撇就是左子树的延伸,q那一捺就是右子树的延伸,所以其实是按象形的意义来命名的,这比left和right还要直观,因此,bd也可以认为是倒过来的二叉树的表示法。

1. 二叉树的右视图

题目链接:二叉树的右视图 - leetcode
题目描述:
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
题目归纳:
右视图 = 右边的侧视图

解题思路:
解法: 二叉树的右视图 - leetcode官方题解
(1) 从左到右层序遍历。记录层序遍历的最后一个node,即为右视图看到的第一个node。

# 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 rightSideView(self, root: Optional[TreeNode]) -> List[int]: rightmost_value_at_depth = dict() max_depth = -1# deque 数据类型来自于collections 模块,支持从头和尾部的常数时间 append/pop 操作。# deque([1,2,3]) 的用法类似于 list([1,2,3])# 非传统层序遍历写法,只有1层循环,缺点是层和层界限不清,优点是写起来快queue = deque( [(root,0)] ) # deque = double-ended queue,双向队列。该队列的最小单元是(node,node_depth)while queue:node, depth = queue.popleft() # 若使用 Python 的 list,通过 list.pop(0) 去除头部会消耗 O(n) 的时间。if node:# 维护最大深度max_depth = max(max_depth, depth)# 由于每一层最后一个访问的节点才是答案,因此需要不断更新深度信息rightmost_value_at_depth[depth] = node.valqueue.append((node.left, depth+1))queue.append((node.right, depth+1))# 构造从上到下的右视图结果ans = []for depth in range(max_depth+1):ans.append(rightmost_value_at_depth[depth])return ans

2. 二叉树的层平均值

题目链接:二叉树的层平均值 - leetcode
题目描述:
给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。
题目归纳:
层序遍历+求平均值

解题思路:
解法: 二叉树的层平均值 - leetcode官方题解

# 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 averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:# 层序遍历if not root: return []queue = deque([root])ans = []Sum = 0while queue:lenq = len(queue)Sum = 0# 取出该层的节点,并计算平均值for i in range(lenq):node = queue.popleft()Sum += node.valif node.left: queue.append(node.left)if node.right: queue.append(node.right)ans.append(float(Sum / lenq))return ans

3. 二叉树的层序遍历

题目链接:二叉树的层序遍历 - leetcode
题目描述:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
题目归纳:
就是原始的层序遍历

解题思路:
解法: 二叉树的层序遍历 - leetcode官方题解

# 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 not root: return []ans = []queue = [root]# 传统的层序遍历写法:有2层循环while len(queue) > 0:# 当前层的节点个数curr_layer_len = len(queue)ans.append([])for i in range(curr_layer_len):node = queue.pop(0)ans[-1].append(node.val)if node.left: queue.append(node.left)if node.right: queue.append(node.right)return ans

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

题目链接:二叉树的锯齿形层序遍历 - leetcode
题目描述:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
题目归纳:
层序遍历不要动,取元素的队列来回折返即可。

解题思路:
解法: 二叉树的锯齿形层序遍历 - leetcode官方题解

# 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 zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []left_to_right = False # Flag变量. True表示从左往右遍历,False表示从右往左遍历ans = []queue = deque([root])while queue: # 遍历列表lenq = len(queue)layer = deque([]) # 取元素的双端队列,左右折返放置元素for i in range(lenq):  # 遍历该层节点node = queue.popleft() # 队头if left_to_right:     layer.appendleft(node.val) # 往双端队列的左边插入if node.left: queue.append(node.left) # 记得,一直都是先append(left)再append(right)if node.right: queue.append(node.right)else: # right_to_rightlayer.append(node.val) # 往双端队列的右边插入if node.left: queue.append(node.left)if node.right: queue.append(node.right)ans.append(list(layer)) # 双向链表deque转换成listleft_to_right = not left_to_rightreturn ans

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

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

相关文章

Linux的基础命令学习

pwd - 显示当前工作目录的路径 cd - 切换工作目录,ls - 列出当前目录的文件和子目录 rm - 删除文件或目录 mkdir - 创建新目录 rm - 删除目录 nano/vi - 编辑文本文件,按Enter键进入 之后按i键就可以进入写入模式 之后输入文字以后按Esc键与:q就不保…

C# 图解教程 第5版 —— 第22章 命名空间和程序集

文章目录 22.1 引用其他程序集22.2 命名空间22.2.1 命名空间名称22.2.2 命名空间的补充22.2.3 命名空间跨文件伸展22.2.4 嵌套命名空间 22.3 using 指令22.3.1 using 命名空间指令22.3.2 using 别名指令22.3.3 using static 指令 22.4 程序集的结构22.5 程序集标识符22.6 强命名…

Camunda Asynchronous continuations

示例一 Service public class ExceptionService implements JavaDelegate {Overridepublic void execute(DelegateExecution execution) {System.out.println(1/0);} }ACT_RU_TASK :明明是UserTask2完成任务了,ServiceTask内部出错了,按说事务…

Spring Boot接口请求响应慢,超过10秒以上,如无法优化SQL或代码的情况下,建议写入数据库或缓存中,请求接口时从数据库或缓存中读取返回

举例 Override public Map<String, Object> getCockpitStaffAttendanceTask() {Map<String, Object> map new HashMap<>();int chuqin 0; //出勤int queqin 0; //缺勤int chidao 0; //迟到int zaotui 0; //早退//获取所有设备卡号 并且已经绑定了人Lis…

MS-DETR: Efficient DETR Training with Mixed Supervision论文学习笔记

论文地址&#xff1a;https://arxiv.org/pdf/2401.03989.pdf 代码地址&#xff08;中稿后开源&#xff09;&#xff1a;GitHub - Atten4Vis/MS-DETR: The official implementation for "MS-DETR: Efficient DETR Training with Mixed Supervision" 摘要 DETR 通过迭代…

C语言中对关键字和标识符的理解

1.关键字(keyword) 定义&#xff1a;被C语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单词&#xff09;。 特点&#xff1a;全部关键字都是小写字母。 举例&#xff1a; int、return等已经被C语言定义好了。 传统的C语言&#xff08;ANSI C&#xff0…

2024.1.15

这周是考试周昂&#xff0c;下周有三门相对重要的考试&#xff0c;所以说会将更多的时间与精力投入到复习中去&#xff0c;相对而言的投入到代码中的时间就会变少平时就以复习以前写过的代码为主了&#xff0c;这一周是不打算开新坑的&#xff0c;一切新的学习暂停&#xff0c;…

微调您的Embedding模型以最大限度地提高RAG管道中的相关性检索

英文原文地址&#xff1a;https://betterprogramming.pub/fine-tuning-your-embedding-model-to-maximize-relevance-retrieval-in-rag-pipeline-2ea3fa231149 微调您的Embedding模型以最大限度地提高RAG管道中的相关性检索 微调嵌入前后的 NVIDIA SEC 10-K 文件分析 2023 年…

高效工作法:占位图片生成工具助力项目快速迭代

在现代设计和开发项目中&#xff0c;图片资源的重要性不言而喻。然而&#xff0c;项目中经常会遇到寻找合适图片、调整图片尺寸和格式等问题&#xff0c;这些问题不仅耗时耗力&#xff0c;还可能影响到项目的进度和质量。此时&#xff0c;占位图片生成工具应运而生&#xff0c;…

C++知识补充(一)

C知识补充 由于之前有系统的学过 C 语言&#xff0c;现在在学习 C 的过程中采用的是对比学习方式&#xff0c;C 语言中没有涉及到的会补充记录一下。 内联函数 内联函数(Inline Function)是 C 中一种特殊的函数&#xff0c;其定义直接在每个调用点展开&#xff0c;这意味着编…

Jmeter 测试脚本录制器-HTTP 代理服务器

Jmeter 测试脚本录制器-HTTP 代理服务器 Jmeter 配置代理服务器代理服务器获取请求地址示例图配置步骤 浏览器配置代理Google 浏览器插件配置代理windows 本地网络配置代理 启动录制&#xff0c;生成证书生成证书导入证书Jmeter 配置证书 浏览器点击页面&#xff0c;录制请求地…

Linux笔记:Linux中的文件系统权限

在Red Hat Enterprise Linux 或其他类似的Linux发行版中&#xff0c;全局umask设置通常在几个不同的系统级配置文件中定义。以下是一些可能设置umask的地方&#xff1a; &#xff08;1&#xff09;/etc/profile: 这是为系统上的所有用户设置全局环境变量和启动程序的地方。通…

【算法与数据结构】343、LeetCode整数拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;博主做这道题的时候一直在思考&#xff0c;如何找到 k k k个正整数&#xff0c; k k k究竟为多少合适。…

【Delphi 基础知识 19】Assigned的用法

在Delphi中&#xff0c;Assigned 是一个用于检查指针是否已分配内存的函数。它通常用于检查对象或指针是否已经被分配内存&#xff0c;以避免在未分配内存的情况下引用或操作它。 以下是 Assigned 的一些用法示例&#xff1a; 检查对象是否已分配内存&#xff1a; varMyObject…

linux终端查看文件

ls 命令&#xff1a;ls 命令用于列出当前目录下的文件和子目录。默认情况下&#xff0c;它以字母顺序列出文件和目录的名称。例如&#xff0c;要列出当前目录下的所有文件和目录&#xff0c;可以运行以下命令&#xff1a; ls ls -l 命令&#xff1a;ls -l 命令以长格式显示文件…

Nacos 高级详解

一 、服务集群 1 需求 服务提供者搭建集群 服务调用者&#xff0c;依次显示集群中各服务的信息 2 搭建 1&#xff09;修改服务提供方的controller&#xff0c;打印服务端端口号 package com.czxy.controller;import org.springframework.web.bind.annotation.*;import …

数据结构学习 jz39 数组中出现次数超过一半的数字

关键词&#xff1a;排序 摩尔投票法 摩尔投票法没学过所以没有想到&#xff0c;其他的都自己想。 题目&#xff1a;库存管理 II 方法一&#xff1a; 思路&#xff1a; 排序然后取中间值。因为超过一半所以必定在中间值是我们要的结果。 复杂度计算&#xff1a; 时间复杂度…

vtk9.3 关于vtk --- 来源于官方网站

Visualization Toolkit&#xff08;VTK&#xff09;是一个强大的开源软件系统&#xff0c;提供了在3D计算机图形学、图像处理、建模、体积渲染和科学可视化方面的高级功能。它提供了线程和分布式内存并行处理&#xff0c;以实现可伸缩性和更好的性能。 VTK 是一个跨平台库&…

大数据Doris(五十六):SQL函数之地理位置函数

文章目录 SQL函数之地理位置函数 一、​​​​​​​ST_AsText(GEOMETRY geo)

电阻表示方法和电路应用

电阻 电阻的表示方法 直标法 直标法是将电阻器的类别及主要技术参数的数值直接标注在电阻器表面上 通常用3位阿拉伯数字来标注片状电阻的阻值&#xff0c;其中第1位数代表阻值的第1位有效数&#xff1b;第2位数代表阻值的第二位有效数字&#xff1b;第3位数代表阻值倍率&…