Example #1
0
        private int FindSumRangeInTree(SumSegmentTreeNode tree, int start, int end)
        {
            if (tree == null)
            {
                return(-1);
            }

            if (tree.Start == start && tree.End == end)
            {
                return(tree.Sum);
            }

            var mid = tree.Start + (tree.End - tree.Start) / 2;

            if (end <= mid)
            {
                return(FindSumRangeInTree(tree.Left, start, end));
            }

            if (start > mid)
            {
                return(FindSumRangeInTree(tree.Right, start, end));
            }

            // The range contains mid.
            return(FindSumRangeInTree(tree.Right, mid + 1, end) + FindSumRangeInTree(tree.Left, start, mid));
        }
Example #2
0
        private SumSegmentTreeNode BuildSegmentTree(int[] nums, int start, int end)
        {
            if (start > end)
            {
                return(null);
            }

            var treeNode = new SumSegmentTreeNode(start, end);

            if (start == end)
            {
                treeNode.Sum = nums[start];
            }
            else
            {
                var mid = start + (end - start) / 2;
                treeNode.Left  = BuildSegmentTree(nums, start, mid);
                treeNode.Right = BuildSegmentTree(nums, mid + 1, end);

                treeNode.Sum = treeNode.Left.Sum + treeNode.Right.Sum;
            }
            return(treeNode);
        }
Example #3
0
        private void UpdateTree(SumSegmentTreeNode tree, int pos, int val)
        {
            // Handle single node tree
            if (tree.Start == tree.End)
            {
                tree.Sum = val;
            }
            else
            {
                var mid = tree.Start + (tree.End - tree.Start) / 2;
                // Recursively update segment tree children.
                if (pos <= mid)
                {
                    UpdateTree(tree.Left, pos, val);
                }
                else
                {
                    UpdateTree(tree.Right, pos, val);
                }

                tree.Sum = tree.Left.Sum + tree.Right.Sum;
            }
        }
Example #4
0
 public NumArrayWithSegmentTree(int[] nums)
 {
     _root = BuildSegmentTree(nums, 0, nums.Length);
 }