|
143 | 143 | return childNode;
|
144 | 144 | }
|
145 | 145 |
|
| 146 | + function maintain(node, leftChild) { |
| 147 | + if (node === Nil) { |
| 148 | + return node; |
| 149 | + } |
| 150 | + var savedNode = node; |
| 151 | + if (leftChild) { |
| 152 | + if (node.left.left.size > node.right.size) { |
| 153 | + node = RightRotate(node, node.left); |
| 154 | + } else if (node.left.right.size > node.right.size) { |
| 155 | + LeftRotate(node.left, node.left.right); |
| 156 | + node = RightRotate(node, node.left); |
| 157 | + } |
| 158 | + } else { |
| 159 | + if (node.right.right.size > node.left.size) { |
| 160 | + node = LeftRotate(node, node.right); |
| 161 | + } else if (node.right.left.size > node.left.size) { |
| 162 | + RightRotate(node.right, node.right.left); |
| 163 | + node = LeftRotate(node, node.right); |
| 164 | + } |
| 165 | + } |
| 166 | + node.updateSize(); |
| 167 | + if (node === savedNode) { |
| 168 | + return node; |
| 169 | + } |
| 170 | + maintain(node.left, false); |
| 171 | + maintain(node.right, true); |
| 172 | + node = maintain(node, true); |
| 173 | + node = maintain(node, false); |
| 174 | + return node; |
| 175 | + } |
| 176 | + |
146 | 177 | function maintainSizeBalancedTree(node) {
|
147 | 178 | while (node.parent !== Nil) {
|
148 | 179 | let childNode = node;
|
149 | 180 | node = node.parent;
|
150 |
| - if (node.right === childNode) { |
151 |
| - if (childNode.right.size > node.left.size) { |
152 |
| - node = LeftRotate(node, childNode); |
153 |
| - } |
| 181 | + if (node.left == childNode) { |
| 182 | + node = maintain(node, true); |
154 | 183 | } else {
|
155 |
| - if (childNode.left.size > node.right.size) { |
156 |
| - node = RightRotate(node, childNode); |
157 |
| - } |
| 184 | + node = maintain(node, false); |
158 | 185 | }
|
159 |
| - node.updateSize(); |
160 | 186 | }
|
161 | 187 | return node;
|
162 | 188 | }
|
|
0 commit comments