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

2024-01-16 04:52

本文主要是介绍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

这篇关于Leetcode面试经典150题刷题记录 —— 二叉树层次遍历篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/611394

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

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

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr