private NailNumber CheckSplit(ref bool split) { if (IsNumber) { if (_value > 9) { var node = new NailNumber(new NailNumber(_value / 2), new NailNumber((_value + 1) / 2)); node._left.SetPrevious(_previous); _previous?.SetNext(node._left); node._right.SetNext(_next); _next?.SetPrevious(node._right); split = true; return(node); } } else { _left = _left.CheckSplit(ref split); if (split) { return(this); } _right = _right.CheckSplit(ref split); } return(this); }
private NailNumber(NailNumber left, NailNumber right) { _left = left; _right = right; _left.SetNext(_right.Left()); _right.SetPrevious(_left.Right()); }
private NailNumber CheckExplode(ref bool explode, int depth = 0) { if (IsNumber) { return(this); } if (depth == 4) { // too deep explode = true; var node = new NailNumber(0); if (_left._previous != null) { _left._previous._value += _left._value; node.SetPrevious(_left._previous); _left._previous.SetNext(node); } if (_right._next == null) { return(node); } _right._next._value += _right._value; node.SetNext(_right._next); _right._next.SetPrevious(node); return(node); } _left = _left.CheckExplode(ref explode, depth + 1); _right = _right.CheckExplode(ref explode, depth + 1); return(this); }
private NailNumber(NailNumber other) { if (other.IsNumber) { _value = other._value; } else { _left = new NailNumber(other._left); _right = new NailNumber(other._right); _left.SetNext(_right.Left()); _right.SetPrevious(_left.Right()); } }