(Node<K, V> node)
| 2096 | } |
| 2097 | |
| 2098 | private void deleteNode(Node<K, V> node) { |
| 2099 | if (node.right == null) { |
| 2100 | if (node.left != null) { |
| 2101 | attachToParent(node, node.left); |
| 2102 | } else { |
| 2103 | attachNullToParent(node); |
| 2104 | } |
| 2105 | fixNextChain(node); |
| 2106 | } else if(node.left == null) { // node.right != null |
| 2107 | attachToParent(node, node.right); |
| 2108 | fixNextChain(node); |
| 2109 | } else { |
| 2110 | // Here node.left!=nul && node.right!=null |
| 2111 | // node.next should replace node in tree |
| 2112 | // node.next!=null by tree logic. |
| 2113 | // node.next.left==null by tree logic. |
| 2114 | // node.next.right may be null or non-null |
| 2115 | Node<K, V> toMoveUp = node.next; |
| 2116 | fixNextChain(node); |
| 2117 | if(toMoveUp.right==null){ |
| 2118 | attachNullToParent(toMoveUp); |
| 2119 | } else { |
| 2120 | attachToParent(toMoveUp, toMoveUp.right); |
| 2121 | } |
| 2122 | // Here toMoveUp is ready to replace node |
| 2123 | toMoveUp.left = node.left; |
| 2124 | if (node.left != null) { |
| 2125 | node.left.parent = toMoveUp; |
| 2126 | } |
| 2127 | toMoveUp.right = node.right; |
| 2128 | if (node.right != null) { |
| 2129 | node.right.parent = toMoveUp; |
| 2130 | } |
| 2131 | attachToParentNoFixup(node,toMoveUp); |
| 2132 | toMoveUp.color = node.color; |
| 2133 | } |
| 2134 | } |
| 2135 | |
| 2136 | private void attachToParentNoFixup(Node<K, V> toDelete, Node<K, V> toConnect) { |
| 2137 | // assert toConnect!=null |
no test coverage detected