public object Get(BitVector key) { var curnode = Root; while (curnode != null) { if (curnode.Children == null) return null; // Get the best fitting index var bestindex = -1; var bestlength = 0; for (var i = 0; i < curnode.Children.Count; i++) { var b = ((Node) (curnode.Children[i])).Key.LongestCommonPrefix(key); if (b > bestlength) { bestlength = b; bestindex = i; } } if (bestindex != -1) { key = key.Range(bestlength, key.Length - bestlength); curnode = ((Node) curnode.Children[bestindex]); if (key.Length == 0) return curnode.Data; } else { return null; } } return null; }
// // This Add method attach an object "data" to a node "n" using the BitVector key as path. // private void Add(Node n, BitVector key, object data) { if (n.Key == null) { AddAsChildren(n, key, data); return; } // // First, calculate the longest common prefix for the key // and the BitVector stored in this node. // var longest = key.LongestCommonPrefix(n.Key); Debug.Assert(longest != 0); if (longest == n.Key.Length) { // // If the current node is a perfect prefix of the // key, then remove the prefix from the key, and // we continue our walk on the children. // key = key.Range(longest, key.Length - longest); AddAsChildren(n, key, data); return; } // // Here, n.Key and key share a common prefix. So we: // // - Create a new node with this common prefix // held there, // // - make n.Key and a new node with key as // children of this new node. var common = n.Key.Range(0, longest); var c1 = new Node(); c1.Key = n.Key.Range(longest, n.Key.Length - longest); c1.Data = n.Data; c1.Children = n.Children; var c2 = new Node(); c2.Key = key.Range(longest, key.Length - longest); c2.Data = data; n.Key = common; n.Data = null; n.Children = new ArrayList(); n.Children.Add(c1); n.Children.Add(c2); return; }