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

构建存Min/Max的Segment Tree时子节点类型不一致报错的解决方法

解决线段树节点类型不兼容的问题

嘿,这个问题我之前也碰到过——你的线段树里叶子节点存的是整数,非叶子节点存的是[min, max]列表,类型不统一,调用min/max函数时自然会报错(毕竟整数和列表没法直接比较大小嘛)。

问题根源拆解

看你的代码逻辑:

  • 叶子节点(low==high时):直接把arr[low](整数)赋值给segment_tree[pos]
  • 非叶子节点:把[min(子节点), max(子节点)](列表)赋值给segment_tree[pos]

当递归到上层节点计算时,子节点可能一个是整数、一个是列表,min()函数收到混合类型的参数,直接触发类型错误。

解决方案:统一所有节点的数据结构

不管是叶子节点还是非叶子节点,都存储[min_value, max_value]格式的列表。这样所有节点结构一致,计算父节点时就能正确提取子节点的min和max值。

修改后的完整代码如下:

from math import log2, ceil

def segment(low, high, pos):
    if low == high:
        # 叶子节点的min和max都是自身的值,统一存为列表
        segment_tree[pos] = [arr[low], arr[low]]
        return
    mid = (high + low) // 2
    segment(low, mid, 2*pos+1)
    segment(mid+1, high, 2*pos+2)
    # 现在子节点都是[min, max]列表,分别取它们的min和max计算父节点
    left_child = segment_tree[2*pos+1]
    right_child = segment_tree[2*pos+2]
    segment_tree[pos] = [
        min(left_child[0], right_child[0]),
        max(left_child[1], right_child[1])
    ]

length = 5
arr = [1,2,3,4,5]
low = 0
high = length - 1
height = int(ceil(log2(length)))
pos = 0
size_of_segment_tree = 2*int(pow(2, height)) - 1
segment_tree = [0]*size_of_segment_tree
segment(low, high, pos)

# 可以打印验证结果
print(segment_tree)

修改后的效果

运行这段代码后,线段树的所有节点都是[min, max]格式:

  • 叶子节点:比如对应arr[0]=1的节点是[1,1],对应arr[4]=5的节点是[5,5]
  • 上层节点:比如根节点会是[1,5](整个数组的min和max),覆盖[1,2,3]的中间节点是[1,3]

这样后续不管是查询区间min还是max,都能通过统一的节点结构快速提取对应值,再也不会出现类型错误啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:32:07