private CRTNode <string> treeWithAlmostRightMostInsert()
        {
            var t = new CRTRoot <string>(
                new CRTInner <string>(0, UInt128.FromZeroFilledPrefix("0"),
                                      new CRTInner <string>(1, UInt128.FromZeroFilledPrefix("00"),
                                                            new CRTInner <string>(4, UInt128.FromZeroFilledPrefix("00001"),
                                                                                  new CRTLeaf <string>(UInt128.FromZeroFilledPrefix("000010"), "hi!"),
                                                                                  new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("000011"))
                                                                                  ),
                                                            new CRTInner <string>(3, UInt128.FromZeroFilledPrefix("0010"),
                                                                                  new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("00100")),
                                                                                  new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("00101"))
                                                                                  )
                                                            ),
                                      new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("01"))
                                      ),
                new CRTInner <string>(1, UInt128.FromZeroFilledPrefix("11"),
                                      new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("110")),
                                      new CRTInner <string>(126, UInt128.Zero.Sub(UInt128.One).Sub(UInt128.One),
                                                            new CRTLeaf <string>(UInt128.Zero.Sub(UInt128.One).Sub(UInt128.One), "stuff"),
                                                            new CRTLeaf <string>(UInt128.Zero.Sub(UInt128.One), "all one or none!")
                                                            )
                                      )
                );

            return(t);
        }
        private CRTNode <string> treeWithLeftMostInsert()
        {
            var t = new CRTRoot <string>(
                new CRTInner <string>(0, UInt128.FromZeroFilledPrefix("0"),
                                      new CRTInner <string>(1, UInt128.FromZeroFilledPrefix("00"),
                                                            new CRTInner <string>(3, UInt128.FromZeroFilledPrefix("0000"),
                                                                                  // START: difference
                                                                                  new CRTLeaf <string>(UInt128.FromZeroFilledPrefix("0000"), "none"),
                                                                                  new CRTInner <string>(4, UInt128.FromZeroFilledPrefix("00001"),
                                                                                                        new CRTLeaf <string>(UInt128.FromZeroFilledPrefix("000010"), "hi!"),
                                                                                                        new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("000011"))
                                                                                                        )
                                                                                  // END: difference
                                                                                  ),
                                                            new CRTInner <string>(3, UInt128.FromZeroFilledPrefix("0010"),
                                                                                  new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("00100")),
                                                                                  new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("00101"))
                                                                                  )
                                                            ),
                                      new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("01"))
                                      ),
                new CRTInner <string>(1, UInt128.FromZeroFilledPrefix("11"),
                                      new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("110")),
                                      new CRTLeaf <string>(UInt128.Zero.Sub(UInt128.One), "all one or none!")
                                      )
                );

            return(t);
        }
        public void InsertEmptyTreeTest()
        {
            // initialize a tree
            var t = new CRTRoot <String>();

            // insert a value
            var key   = UInt128.FromBinaryString("00000000000000000000000101010000000000000000000000000000000000000000000000000000000000000000000000000000000000010001000110010111");
            var value = "first";
            var t2    = t.Replace(key, value);

            // expected outcome
            var te = new CRTRoot <String>(
                new CRTLeaf <String>(key, value),
                new CRTEmptyLeaf <String>(UInt128.MaxValue)
                );

            Assert.AreEqual(te, t2);
        }
        private CRTNode <string> setupTree()
        {
            var t = new CRTRoot <string>(
                new CRTInner <string>(0, UInt128.FromZeroFilledPrefix("0"),
                                      new CRTInner <string>(1, UInt128.FromZeroFilledPrefix("00"),
                                                            new CRTInner <string>(4, UInt128.FromZeroFilledPrefix("00001"),
                                                                                  new CRTLeaf <string>(UInt128.FromZeroFilledPrefix("000010"), "hi!"),
                                                                                  new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("000011"))
                                                                                  ),
                                                            new CRTInner <string>(3, UInt128.FromZeroFilledPrefix("0010"),
                                                                                  new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("00100")),
                                                                                  new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("00101"))
                                                                                  )
                                                            ),
                                      new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("01"))
                                      ),
                new CRTInner <string>(1, UInt128.FromZeroFilledPrefix("11"),
                                      new CRTEmptyLeaf <string>(UInt128.FromZeroFilledPrefix("110")),
                                      new CRTLeaf <string>(UInt128.Zero.Sub(UInt128.One), "all one or none!")
                                      )
                );

            return(t);
        }