public Id[] Split() { var i1 = new Id(); var i2 = new Id(); if (IsLeaf && Value == 0) { i1.SetAsLeaf(0); i2.SetAsLeaf(0); return new[] { i1, i2 }; } if (IsLeaf && Value == 1) { // id = 1 i1.SetAsNode(0, 1, 0, null); i2.SetAsNode(0, 0, 1, null); return new[] { i1, i2 }; } if (!IsLeaf && (Left.IsLeaf && Left.Value == 0) && (!Right.IsLeaf || Right.Value == 1)) { // id = (0, i) var ip = Right.Split(); i1.SetAsNode(0, new Id(0), ip[0]); i2.SetAsNode(0, new Id(0), ip[1]); return new[] { i1, i2 }; } if (!IsLeaf && (!Left.IsLeaf || Left.Value == 1) && (Right.IsLeaf && Right.Value == 0)) { // id = (i, 0) var ip = Left.Split(); i1.SetAsNode(0, ip[0], new Id(0)); i2.SetAsNode(0, ip[1], new Id(0)); return new[] { i1, i2 }; } if (!IsLeaf && (!Left.IsLeaf || Left.Value == 1) && (!Right.IsLeaf || Right.Value == 1)) { // id = (i1, i2) i1.SetAsNode(0, Clone(Left), new Id(0)); i2.SetAsNode(0, new Id(0), Clone(Right)); return new[] { i1, i2 }; } throw new IdOperationException("Split failed", this, null); }