(node, nilNode Node[T])
| 153 | } |
| 154 | |
| 155 | func predecessorHelper[T constraints.Ordered](node, nilNode Node[T]) (T, bool) { |
| 156 | if node.Left() != nilNode { |
| 157 | return maximum(node.Left(), nilNode).Key(), true |
| 158 | } |
| 159 | |
| 160 | p := node.Parent() |
| 161 | for p != nilNode && node == p.Left() { |
| 162 | node = p |
| 163 | p = p.Parent() |
| 164 | } |
| 165 | |
| 166 | if p == nilNode { |
| 167 | var dft T |
| 168 | return dft, false |
| 169 | } |
| 170 | return p.Key(), true |
| 171 | } |
| 172 | |
| 173 | func successorHelper[T constraints.Ordered](node, nilNode Node[T]) (T, bool) { |
| 174 | if node.Right() != nilNode { |