@@ -60,18 +60,76 @@ class SegmentTree<E> {
6060 return 2 * index + 2 ;
6161 }
6262
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+
63120 @override
64121 String toString () {
65122 StringBuffer res = new StringBuffer ();
66123 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 ) {
69126 res.write (_tree! [i]);
70- else
127+ } else {
71128 res.write ("null" );
72-
73- if (i != _tree! .length - 1 )
129+ }
130+ if (i != _tree! .length - 1 ) {
74131 res.write (", " );
132+ }
75133 }
76134 res.write (']' );
77135 return res.toString ();
0 commit comments