public static Dictionary<TrieNode, int> getDescendant(TrieNode n,
            Dictionary<TrieNode, int> descendents, int depth, int k)
        {
            Queue<pair> queue = new Queue<pair>();
            queue.Enqueue(new pair(n, k));
            if (k > depth)
                return descendents;
            if (!descendents.ContainsKey(n))
                descendents.Add(n, k);
            else
            {
                int kk = descendents[n];
                if (k > kk) descendents[n] = kk;
            }
            while (queue.Count > 0)
            {
                // get the first TrieNode of the queue
                pair p = queue.Dequeue();
                // add children to the queue
                if (p.depth < depth)
                {
                    foreach (TrieNode c in p.n.SubTrieNodes)
                    {
                        if (descendents.ContainsKey(c))
                        {
                            int v = descendents[c];
                            int vv = (int)Math.Min(p.depth + 1, v);

                            if (vv <= depth)
                            {
                                descendents[c] = vv;
                                queue.Enqueue(new pair(c, vv));
                            }
                        }
                        else
                        {
                            descendents.Add(c, p.depth + 1);
                        }
                    }
                }
            }
            return descendents;
        }
 public static Dictionary<TrieNode, int> getDescendant(TrieNode n, int depth, int k)
 {
     Dictionary<TrieNode, int> descendents = new Dictionary<TrieNode, int>();
     getDescendant(n, descendents, depth, k);
     return descendents;
 }
 public pair(TrieNode n, int depth)
 {
     this.n = n;
     this.depth = depth;
 }
 public static void BuildActiveNodes(TrieNode n, int depth)
 {
     TrieNode r=n.parent;
     mybuildActiveTrieNodes(r, n, depth);
 }
        //for inner TrieNodes
        private static void mybuildActiveTrieNodes(TrieNode parent, TrieNode TrieNode, int depth)
        {
            Dictionary<TrieNode, int> parentActiveTrieNodes = ht[parent];
            Dictionary<TrieNode, int> activeTrieNodes = ht[TrieNode];
            // deletion
            // add all p active TrieNode to this, with distance +1 if possible
            foreach (TrieNode n in parentActiveTrieNodes.Keys)
            {
                if (n == parent && depth > 0)
                    ht[TrieNode].Add(n, 1);
                else
                {
                    int l = parentActiveTrieNodes[n] + 1;
                    if (l <= depth)
                        ht[TrieNode].Add(n, l);
                }
            }

            foreach (TrieNode p in parentActiveTrieNodes.Keys)
            {
                // if p.c=c // we have a match
                int d = parentActiveTrieNodes[p];

                if (p.c == TrieNode.c)
                {
                    getDescendant(TrieNode, activeTrieNodes, depth, d);
                }

                foreach (TrieNode c in p.SubTrieNodes)
                {
                    if (c == TrieNode)
                        continue;
                    // insertion
                    if (c.c == TrieNode.c)
                    {// we have a match
                        getDescendant(c, activeTrieNodes, depth, d);
                    }
                    else
                        if (d <= depth)
                        {
                            if (activeTrieNodes.ContainsKey(c))
                            {
                                int m = Math.Min(d + 1, activeTrieNodes[c]);
                                if (m <= depth)
                                    activeTrieNodes[c] = m;
                            }
                            else
                            {
                                activeTrieNodes.Add(c, d + 1);
                            }
                        }
                }
            }
            // add myself & my Descendant
            if (activeTrieNodes.ContainsKey(TrieNode))
            {
                activeTrieNodes[TrieNode] = 0;
            }
            else
                activeTrieNodes.Add(TrieNode, 0);
            getDescendant(TrieNode, activeTrieNodes, depth, 0);

            // System.out.println("Active TrieNode " + id + ":" + Text() + ":"
            // + activeTrieNodes);
        }