private int _query(SegmentTreeNode node, int start, int end) { if (start <= node.Start && node.End <= end) { return(node.Value); } int retValue = 0; if (SegmentTreeType == SegmentTreeType.Max) { retValue = int.MinValue; } else if (SegmentTreeType == SegmentTreeType.Min) { retValue = int.MaxValue; } if (start <= (node.Start + node.End) / 2) { retValue = getValueByType(retValue, _query(node.LeftChild, start, end)); } if ((node.Start + node.End) / 2 + 1 <= end) { retValue = getValueByType(retValue, _query(node.RightChild, start, end)); } return(retValue); }
public SegmentTreeNode BuildTree(int[] inputArray) { if (inputArray == null || inputArray.Length == 0) { return(null); } Root = _build(0, inputArray.Length - 1, inputArray); return(Root); }
private SegmentTreeNode _build(int start, int end, int[] array) { SegmentTreeNode node = new SegmentTreeNode(start, end, array[start]); if (start == end) { return(node); } node.LeftChild = _build(start, (start + end) / 2, array); node.RightChild = _build((start + end) / 2 + 1, end, array); node.Value = getValueByType(node.LeftChild.Value, node.RightChild.Value); return(node); }
private void _update(SegmentTreeNode node, int index, int value) { if (node.Start == node.End && node.Start == index) { node.Value = value; return; } if (index <= (node.Start + node.End) / 2) { _update(node.LeftChild, index, value); } else { _update(node.RightChild, index, value); } node.Value = getValueByType(node.LeftChild.Value, node.RightChild.Value); }