[英]How to build a segment tree using python?
如何使用python构建段树......我尝试了以下代码:#
def built(arr,start,end,tree,tn):
if end==start:
tree[tn]=arr[start]
return
mid=(start+end)/2
built(arr,start,mid,tree,2*tn)
built(arr,mid+1,end,tree,2*tn+1)
tree[tn]=tree[2*tn]+tree[2*tn+1]
arr=[1,2,3,4,5,6]
tree=[0,0,0,0,0,0,0,0,0,0,0,0]
built(arr,0,5,tree,1)
for i in tree:
print (i)
代码有什么问题......给出运行时错误(列表分配索引超出范围)
这会起作用
def built(arr,start,end,tree,tn):
if end==start:
tree[tn]=arr[start]
return
mid=(start+end)/2
built(arr,start,mid,tree,2*tn)
built(arr,mid+1,end,tree,2*tn+1)
tree[tn]=tree[2*tn]+tree[2*tn+1]
arr=[1,2,3,4,5,6]
tree=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
built(arr,0,5,tree,1)
for i in tree:
print (i)
tree
数组的大小应为arr
大小的4倍。
希望这可以帮助!
我还花了一些时间来弄清楚这一点:
段树如下所示:
21
/ \
6 15
/ \ / \
3 3 9 6
/ \ / \
1 2 4 5
但是,即使看起来它只有11个节点,但缺少的部分是0,真实的树是这样的:
21
/ \
6 15
/ \ / \
3 3 9 6
/ \ / \ / \ / \
1 2 0 0 4 5 0 0
我们需要0,因为缺少0会导致混乱,例如,如果缺少0,我们就不能说4和5是9的孩子。
因为段树是完整的二叉树并且平衡(我们总是将其分成两半)。 考虑到树从索引1开始,此处树的长度必须大于等于16。
我们可以为tree = [0范围内的_分配0]并得到正确的答案:[0、21、6、15、3、3、9、6、1、2、0、0、4、5, 0,0]。
这就是我们得到4n的方式:如果数组长度不是2 ^ i,则树的高度至少应为⎣logn⎦+ 1,因此树的总节点数将为2 * 2 ^(logn + 1)= 2 ^(logn + 2)= 4 * 2 ^ logn = 4 * n
因此,我们通常分配4n大小的树。
您还可以绘制运行此代码的堆栈,在运行了几轮之后,tree [12]将为4,因此这就是代码出现错误“索引超出范围”的原因。
没有点低于树的高度,在这种情况下,您可以检查start> end并在情况为true时返回。
def built(arr,start,end,tree,tn):
if end==start:
tree[tn]=arr[start]
return
elif start > end:
return
mid=(start+end)/2
built(arr,start,mid,tree,2*tn)
built(arr,mid+1,end,tree,2*tn+1)
tree[tn]=tree[2*tn]+tree[2*tn+1]
arr=[1,2,3,4,5,6]
tree=[0,0,0,0,0,0,0,0,0,0,0,0]
built(arr,0,5,tree,1)
for i in tree:
print (i)
您可以初始化数组以将树构建为2 *(2 ** h)-1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.