leetcode hot100 199. 二叉树的右视图 medium 层序遍历dfs


广度优先搜索 (BFS) ------ 层序遍历法

这是最直觉的方法。一层一层地遍历树,只记录每一层的最后一个节点。

工具:队列(Queue)。

步骤:

  1. 把根节点放进队列。
  2. 当队列不为空时,计算当前层的节点数 n。
  3. 循环 n 次,把这一层的所有节点都弹出来。
  4. 关键点:当你处理到这一层的第 n 个(即最后一个)节点时,把它存入结果列表

时间复杂度O(N)

我们必须访问树中的每一个节点(每个节点进出队列各一次),N 为节点总数。
空间复杂度O(W)

W 是树的最大宽度(即节点最多的一层)。在满二叉树中,最后一层大约有 N/2 个节点,所以空间复杂度最坏也是 O(N)。

python 复制代码
# 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

from collections import deque
class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        
        q = deque([root])  # 从顶层开始, deque放当前处理层的元素

        res = []

        while q:

            # 1. 记录当前这一层有多少个节点
            level_size = len(q) 

            # 2. 连续弹出 level_size 次,确保只处理当前层
            for i in range(level_size):
                node = q.popleft()  # 弹出当前节点
                if i == level_size - 1:  # 如果是最后一个节点
                    res.append(node.val)

                # 加入当前节点的左右节点
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)

        return res

递归 深度优先

递归的同时记录深度,根-右-左

时间复杂度O(N)

同样需要走遍每个节点。虽然我们只取每层第一个看到的,但为了确认没有更深的节点,程序必须遍历完整棵树。
空间复杂度O(H)

H 是树的最大高度。这是由递归产生的系统栈深度决定的。

特点:

如果树是平衡的,H=log⁡NH = \log NH=logN,此时 DFS 比 BFS 节省很多内存。

如果树退化成一根直线(链表),H=NH = NH=N,此时两者空间开销差不多。

相关推荐
AndrewHZ2 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场3 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾4 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI4 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法
山峰哥4 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
小程故事多_805 小时前
用GRPO算法重塑多智能体系统,从原理落地到复杂任务规划实战
人工智能·算法
Hi李耶5 小时前
【LeetCode】541.反转字符串 II
算法·leetcode·职场和发展
shylyly_5 小时前
104.二叉树的最大深度
数据结构·算法·104.二叉树的最大深度
AI科技星5 小时前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星