如何查找二叉树中四个方向均被遮挡的非暴露节点
二叉树非暴露节点查找实现
判定规则(四个条件需同时满足)
- 顶部不暴露:节点存在父节点,排除根节点
- 底部不暴露:节点至少有一个子节点,排除叶子节点
- 左侧不暴露:节点所在水平层的左侧至少存在1个其他节点,排除每层最左节点
- 右侧不暴露:节点所在水平层的右侧至少存在1个其他节点,排除每层最右节点
实现思路
优先选择层序遍历(BFS)方案,天然按水平层处理节点,无需额外计算节点深度:
- 逐层遍历二叉树,每次拿到当前层的完整节点列表
- 直接跳过当前层的第一个和最后一个节点,天然满足左右侧均被遮挡的要求
- 对剩余的中间节点,只要同时满足「不是根节点」「存在至少一个子节点」两个条件,就属于非暴露节点
代码示例
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def find_non_exposed_nodes(root: TreeNode) -> list[TreeNode]: if not root: return [] res = [] from collections import deque q = deque([root]) while q: level_size = len(q) # 遍历当前层所有节点 for i in range(level_size): node = q.popleft() # 跳过层首、层尾节点(左右至少一侧暴露) if i == 0 or i == level_size - 1: pass else: # 检查顶部遮挡(非根)+ 底部遮挡(至少有一个子节点) if node != root and (node.left or node.right): res.append(node) # 子节点入队 if node.left: q.append(node.left) if node.right: q.append(node.right) return res
边界情况说明
该方案兼容非完全二叉树场景,层序遍历会自动记录当前层的所有实际存在的节点,不会把空占位节点算入层级统计,不会出现左右侧遮挡判定错误的问题。
内容的提问来源于stack exchange,提问作者vader
相关产品推荐
相关产品推荐

