@@ -60,18 +60,76 @@ class SegmentTree<E> {
60
60
return 2 * index + 2 ;
61
61
}
62
62
63
+ query (int queryL, int queryR) {
64
+ if (queryL < 0 ||
65
+ queryL >= _data! .length ||
66
+ queryR < 0 ||
67
+ queryR >= _data! .length ||
68
+ queryL > queryR) {
69
+ throw new Exception ("Index is illegal." );
70
+ }
71
+ return _queryDetail (0 , 0 , _data! .length - 1 , queryL, queryR);
72
+ }
73
+
74
+ _queryDetail (int treeIndex, int l, int r, int queryL, int queryR) {
75
+ if (l == queryL && r == queryR) {
76
+ return _tree! [treeIndex];
77
+ }
78
+ int mid = l + ((r - l) / 2 ).toInt ();
79
+ // treeIndex的节点分为[l...mid]和[mid+1...r]两部分
80
+
81
+ int leftTreeIndex = _leftChild (treeIndex);
82
+ int rightTreeIndex = _rightChild (treeIndex);
83
+ if (queryL >= mid + 1 ) {
84
+ return _queryDetail (rightTreeIndex, mid + 1 , r, queryL, queryR);
85
+ } else if (queryR <= mid) {
86
+ return _queryDetail (leftTreeIndex, l, mid, queryL, queryR);
87
+ }
88
+ E leftResult = _queryDetail (leftTreeIndex, l, mid, queryL, mid);
89
+ E rightResult = _queryDetail (rightTreeIndex, mid + 1 , r, mid + 1 , queryR);
90
+ return _merger! .merge (leftResult, rightResult);
91
+ }
92
+
93
+ //将index位置的值,更新为e
94
+ set (int index, E e){
95
+ if (index < 0 || index >= _data! .length) {
96
+ throw new Exception ("Index is illegal" );
97
+ }
98
+ _data! [index] = e;
99
+ _setDetail (0 , 0 , _data! .length - 1 , index, e);
100
+ }
101
+
102
+ // 在以treeIndex为根的线段树中更新index的值为e
103
+ _setDetail (int treeIndex, int l, int r, int index, E e){
104
+ if (l == r){
105
+ _tree! [treeIndex] = e;
106
+ return ;
107
+ }
108
+ int mid = l + ((r - l) / 2 ).toInt ();
109
+ // treeIndex的节点分为[l...mid]和[mid+1...r]两部分
110
+ int leftTreeIndex = _leftChild (treeIndex);
111
+ int rightTreeIndex = _rightChild (treeIndex);
112
+ if (index >= mid + 1 ) {
113
+ _setDetail (rightTreeIndex, mid + 1 , r, index, e);
114
+ }else { // index <= mid
115
+ _setDetail (leftTreeIndex, l, mid, index, e);
116
+ }
117
+ _tree! [treeIndex] = _merger! .merge (_tree! [leftTreeIndex], _tree! [rightTreeIndex]);
118
+ }
119
+
63
120
@override
64
121
String toString () {
65
122
StringBuffer res = new StringBuffer ();
66
123
res.write ('[' );
67
- for (int i = 0 ; i < _tree! .length ; i ++ ){
68
- if (_tree! [i] != null )
124
+ for (int i = 0 ; i < _tree! .length; i++ ) {
125
+ if (_tree! [i] != null ) {
69
126
res.write (_tree! [i]);
70
- else
127
+ } else {
71
128
res.write ("null" );
72
-
73
- if (i != _tree! .length - 1 )
129
+ }
130
+ if (i != _tree! .length - 1 ) {
74
131
res.write (", " );
132
+ }
75
133
}
76
134
res.write (']' );
77
135
return res.toString ();
0 commit comments