C# 在理解用于构建段树的递归方面有困难

C# 在理解用于构建段树的递归方面有困难,c#,segment-tree,C#,Segment Tree,假设有一个n=5的数组 int[]arr={1,2,3,4,5} 及 int[]段树=新的int[n*4] 下面是构建此分段树的代码 buildSegmentTree(a,1,0,n-1) 当我打印段树的值时,这就是我得到的输出 015693434512000 我理解这些值的含义(例如15是6和9的总和),但我不理解它们是如何存储的,调用是如何执行的。通过在纸上构建树,您可以很容易地理解它。 记住: 如果节点具有(0,n-1)间隔,则左子节点具有(0,mid),右子节点具有(mid+1,n-1)

假设有一个
n=5的数组

int[]arr={1,2,3,4,5}

int[]段树=新的int[n*4]

下面是构建此分段树的代码

buildSegmentTree(a,1,0,n-1)

当我打印段树的值时,这就是我得到的输出

015693434512000


我理解这些值的含义(例如15是6和9的总和),但我不理解它们是如何存储的,调用是如何执行的。

通过在纸上构建树,您可以很容易地理解它。
记住:
如果节点具有(0,n-1)间隔,则左子节点具有(0,mid),右子节点具有(mid+1,n-1)。
根据给定的arr数组,将间隔取为(0,4),因为它是您拥有的第一个节点。现在,通过找到这个区间的中间点,我们得到了两个子:左一个是(0,2),另一个是(3,4)。现在看起来如下:
(0,4)
/\
(0,2)(3,4)
现在,同样地,拆分左子级和右子级,直到得到leftLimit=righlimit,这样最后的树看起来像:
(0,4)
/\
(0,2)(3,4)
/\/\
(0,1)(2,2)(3,3)(4,4)
/\
(0,0)(1,1)
arr的第0和第1个元素的和,即,1和2以间隔(0,1)存储在节点中,(0,1)和(2,2)的和存储在(0,2)中,依此类推。 通过这种方式,树将使用包含整个数组arr之和的根元素进行构建。有关更多详细信息,请访问链接


希望它有意义并且会有帮助:)

那么你的问题是如何调试函数?答案很简单:
Console.WriteLine
。它是你的朋友,只要你想看执行的是什么,就使用它。此外,请单击并逐步完成代码。确切地看什么正在执行,以及它是如何执行的。
void buildSegmentTree(int [] a  , int vertex , int leftLimit , int rightLimit)
{    
     if(leftLimit == rightLimit)
     segmentTree[vertex] = a[leftLimit];
     else
     {
          int mid = (leftLimit + rightLimit)/2;
          //Builds the left part of the Segment Tree
          buildSegmentTree(a , vertex * 2 , leftLimit , mid);
          //Builds the right part of the Segment Tree
          buildSegmentTree(a , vertex*2 + 1 , mid+1 , rightLimit);
          segmentTree[vertex] = segmentTree[vertex*2] + segmentTree[vertex*2 + 1];
     }
}