You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找二叉树中四个方向均被遮挡的非暴露节点

二叉树非暴露节点查找实现

判定规则(四个条件需同时满足)

  • 顶部不暴露:节点存在父节点,排除根节点
  • 底部不暴露:节点至少有一个子节点,排除叶子节点
  • 左侧不暴露:节点所在水平层的左侧至少存在1个其他节点,排除每层最左节点
  • 右侧不暴露:节点所在水平层的右侧至少存在1个其他节点,排除每层最右节点

实现思路

优先选择层序遍历(BFS)方案,天然按水平层处理节点,无需额外计算节点深度:

  1. 逐层遍历二叉树,每次拿到当前层的完整节点列表
  2. 直接跳过当前层的第一个和最后一个节点,天然满足左右侧均被遮挡的要求
  3. 对剩余的中间节点,只要同时满足「不是根节点」「存在至少一个子节点」两个条件,就属于非暴露节点

代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:27:03