二叉树顶视图代码提交异常:GFG自定义用例正常但提交出错
问题分析与解决方案
你的代码出现同一输入输出不同的问题,核心原因有两个:
- 判断逻辑错误:用
if not map[dim]判断是否存储节点时,Python会把0视为假值。如果某个垂直维度(dim)的第一个节点值为0,后续同一维度的节点会覆盖它,导致结果不可控; - 变量名冲突:使用Python内置函数
map作为变量名,虽不会直接引发异常,但可能导致未知的环境兼容问题。
另外,用列表模拟队列的pop(0)操作效率极低,建议改用双端队列优化。
修改后的代码如下:
from collections import defaultdict, deque def topView(self, root): # 避免覆盖内置函数,重命名为vertical_map vertical_map = defaultdict(int) # 用deque实现队列,popleft效率更高且稳定 queue = deque() queue.append((root, 0)) while queue: top, dim = queue.popleft() # 仅当维度未记录时存储,确保只保留最上层节点 if dim not in vertical_map: vertical_map[dim] = top.data if top.left: queue.append((top.left, dim - 1)) if top.right: queue.append((top.right, dim + 1)) # 按维度排序后提取结果 sorted_items = sorted(vertical_map.items()) return [item[1] for item in sorted_items]
关键修改说明
- 替换判断条件为
if dim not in vertical_map:严格保证每个垂直维度只存储第一次遇到的节点(即树中最上层的节点,符合顶视图定义),彻底解决0值导致的覆盖问题; - 改用
deque实现队列:popleft()操作时间复杂度为O(1),远优于列表的pop(0)(O(n)),同时确保队列的FIFO特性稳定; - 重命名变量:避免使用内置名称,提升代码可读性与兼容性。
修改后无论节点值是否为0,都能稳定输出正确的顶视图结果,解决同一输入输出不同的问题。
内容的提问来源于stack exchange,提问作者Abhi Gaba
相关产品推荐
相关产品推荐

