(Node<K, V> node)
| 5066 | } |
| 5067 | |
| 5068 | private void deleteNode(Node<K, V> node) { |
| 5069 | if (node.right == null) { |
| 5070 | if (node.left != null) { |
| 5071 | attachToParent(node, node.left); |
| 5072 | } else { |
| 5073 | attachNullToParent(node); |
| 5074 | } |
| 5075 | fixNextChain(node); |
| 5076 | } else if(node.left == null) { // node.right != null |
| 5077 | attachToParent(node, node.right); |
| 5078 | fixNextChain(node); |
| 5079 | } else { |
| 5080 | // Here node.left!=nul && node.right!=null |
| 5081 | // node.next should replace node in tree |
| 5082 | // node.next!=null by tree logic. |
| 5083 | // node.next.left==null by tree logic. |
| 5084 | // node.next.right may be null or non-null |
| 5085 | Node<K, V> toMoveUp = node.next; |
| 5086 | fixNextChain(node); |
| 5087 | if(toMoveUp.right==null){ |
| 5088 | attachNullToParent(toMoveUp); |
| 5089 | } else { |
| 5090 | attachToParent(toMoveUp, toMoveUp.right); |
| 5091 | } |
| 5092 | // Here toMoveUp is ready to replace node |
| 5093 | toMoveUp.left = node.left; |
| 5094 | if (node.left != null) { |
| 5095 | node.left.parent = toMoveUp; |
| 5096 | } |
| 5097 | toMoveUp.right = node.right; |
| 5098 | if (node.right != null) { |
| 5099 | node.right.parent = toMoveUp; |
| 5100 | } |
| 5101 | attachToParentNoFixup(node,toMoveUp); |
| 5102 | toMoveUp.color = node.color; |
| 5103 | } |
| 5104 | } |
| 5105 | |
| 5106 | private void attachToParentNoFixup(Node<K, V> toDelete, Node<K, V> toConnect) { |
| 5107 | // assert toConnect!=null |
no test coverage detected