|
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