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

如何处理不确定层数的循环?二叉树节点路径可达性判断求助

二叉树节点可达性判断优化方案

利用完全二叉树的数学性质直接判断(最优方案)

你生成的是完全二叉树结构,每个节点x的左子节点为2*x,右子节点为2*x+1。判断x能否向下到达y,无需遍历所有路径,只需反向推导y的父节点链:

  • 由于y > x,循环将y替换为其父节点(y = y // 2)
  • 每次替换后检查是否等于x,若在y减小到≤x前匹配成功,说明存在路径;反之则不存在

示例代码:

def is_reachable(x, y):
    while y > x:
        y = y // 2
        if y == x:
            return True
    return False

# 测试示例
print(is_reachable(1, 4))  # 输出True(1→2→4)
print(is_reachable(2, 7))  # 输出False(7的父链是3→1,无法到达2)
print(is_reachable(3, 6))  # 输出True(3→6)

预处理祖先集合(适合批量查询)

如果要处理1000次查询,可提前预处理每个节点的所有祖先并存储为集合,查询时直接判断x是否在y的祖先集合中:

# 假设二叉树最大节点数为n
n = 1000
ancestors = {}

for y in range(1, n + 1):
    ancestors[y] = set()
    current = y // 2
    while current >= 1:
        ancestors[y].add(current)
        current = current // 2

# 查询函数
def is_reachable(x, y):
    return x in ancestors.get(y, set())

预处理仅需一次,后续每次查询均为O(1)时间,适合高频查询场景。

为什么不推荐遍历路径?

DFS/BFS等遍历路径的方法虽然可行,但对于1000次查询来说效率极低——尤其是当节点数n较大时,每次查询都要遍历路径会消耗大量资源。而上述两种方法完全利用完全二叉树的数学特性,时间复杂度远优于遍历法。

内容的提问来源于stack exchange,提问作者michal3321

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:25:14