1.特征不一定是完全二叉树。它必须是一个平面二叉树。叶子节点存储实际值,非叶子节点存储自定义内容。2.时间复杂度操作时间复杂度查询O(logn)3。线段树图4.代码array=$array;$this->build(0,0,$this->array->getSize()-1);}/***构建线段树*@paramint$treeIndex*@paramint$min*@paramint$max*@throws\Exception*/publicfunctionbuild(int$treeIndex,int$min,int$max){//如果线段区间的最小值与最小值相同,则表示为叶子节点if($min==$max){$this->tree[$treeIndex]=$this->array->get($max);返回;}//四舍五入取中间值减去最小值的最大值,然后除以2得到中间值,加上最小值Value$mid=floor(($max-$min)/2)+$分钟;//得到取左孩子的索引值,递归构建$leftIndex=$this->leftChildIndex($treeIndex);$this->build($leftIndex,$min,$mid);//获取右孩子的索引值,并递归构建$rightIndex=$this->rightChildIndex($treeIndex);$this->build($rightIndex,$mid+1,$max);//非叶子节点的值保留给它下面的所有节点的相加值,这里可以改成它下面的节点的总和值$this->tree[$treeIndex]=$this->树[$leftIndex]。'+'。$this->tree[$rightIndex];}/***打印线段树*/publicfunctionvarDump(){ksort($this->tree);print_r($this->tree);}/***获取线段树的长度*@returnint*/publicfunctiongetSize():int{returncount($this->tree);}/***获取左孩子索引*@paramint$parentIndex*@returnint*@throws\Exception*/publicfunctionleftChildIndex(int$parentIndex):int{if($parentIndex<0)thrownew\Exception('父节点索引不能小于0');返回$parentIndex*2+1;}/***获取右子索引*@paramint$parentIndex*@returnint*@throws\Exception*/publicfunctionrightChildIndex(int$parentIndex):int{if($parentIndex<0)thrownew\Exception('Indexofparent节点不能小于0');返回$parentIndex*2+2;}}5.示例addLast($i+10);}$heap=newHeapBundleSegmentTreeHeap($array);$heap->varDump();数组([0]=>10+11+12+13+14+15+16+17+18+19[1]=>10+11+12+13+14[2]=>15+16+17+18+19[3]=>10+11+12[4]=>13+14[5]=>15+16+17[6]=>18+19[7]=>10+11[8]=>12[9]=>13[10]=>14[11]=>15+16[12]=>17[13]=>18[14]=>19[15]=>10[16]]=>11[23]=>15[24]=>16)
