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,此时两者空间开销差不多。

相关推荐
yangSimaticTech12 分钟前
整型数据的转换与比较并不简单
算法
老鼠只爱大米15 分钟前
LeetCode经典算法面试题 #55:跳跃游戏(贪心法、动态规划、BFS等多种实现方案详解)
算法·leetcode·贪心算法·动态规划·bfs·java面试·跳跃游戏
2501_9083298528 分钟前
C++中的备忘录模式
开发语言·c++·算法
qq_416018721 小时前
C++与机器学习框架
开发语言·c++·算法
左左右右左右摇晃1 小时前
数据结构——红黑树
算法
CoovallyAIHub1 小时前
传感器数据相互矛盾时,无人机蜂群如何做出可靠的管道泄漏检测决策?
算法·架构·无人机
CoovallyAIHub1 小时前
Claude Code Review:多 Agent 自动审查 PR,代码产出翻倍后谁来把关?
算法·架构·github
jyan_敬言1 小时前
【算法】高精度算法(加减乘除)
c语言·开发语言·c++·笔记·算法
树獭叔叔1 小时前
内存价格被Google打下来了?: TurboQuant对KVCache的量化
算法·aigc·openai