private SortedDictionary<uint, uint> ConnectedSubgraphsInCluster(int numberNode, int level)
        {
            SortedDictionary<uint, uint> retArray = new SortedDictionary<uint, uint>();

            if (level == container.Level)
            {
                retArray[1] = 1;
                return retArray;
            }
            BitArray node = container.TreeNode(level, numberNode);

            bool haveOne = false;
            for (int i = 0; i < container.BranchingIndex; i++)
            {
                if (container.CountConnectedBlocks(node, i) == 0)
                {
                    SortedDictionary<uint, uint> array =
                        ConnectedSubgraphsInCluster(numberNode * container.BranchingIndex + i,
                        level + 1);

                    foreach (KeyValuePair<uint, uint> kvt in array)
                    {
                        if (retArray.Keys.Contains(kvt.Key))
                            retArray[kvt.Key] += kvt.Value;
                        else
                            retArray.Add(kvt.Key, kvt.Value);
                    }
                }
                else
                    haveOne = true;
            }

            if (haveOne)
            {
                int powPK = Convert.ToInt32(Math.Pow(container.BranchingIndex, container.Level - level - 1));
                EngineForConnectedComp engForConnectedComponent = new EngineForConnectedComp();
                ArrayList arrConnComp = engForConnectedComponent.GetCountConnSGraph(container.NodeAdjacencyLists(node),
                    container.BranchingIndex);
                uint uKey = 0;
                for (int i = 0; i < arrConnComp.Count; i++)
                {
                    uKey = (uint)((int)arrConnComp[i] * powPK);
                    if (retArray.Keys.Contains(uKey))
                        retArray[uKey] += 1;
                    else
                        retArray.Add(uKey, 1);
                }
            }

            return retArray;
        }
        /// <summary>
        /// Retrives the connected subgraphs of the given cluster.
        /// </summary>
        /// <param name="level">The level of cluster.</param>
        /// <param name="numberNode">The index of cluster.</param>
        /// <returns>Connected components.</returns>
        private SortedDictionary<Double, Double> ConnectedSubgraphsInCluster(int level, int numberNode)
        {
            SortedDictionary<Double, Double> retArray = new SortedDictionary<Double, Double>();

            if (level == container.Level)
            {
                retArray[1] = 1;
                return retArray;
            }

            int branchSize = (int)container.Branches[level][numberNode];
            int branchStart = container.FindBranches(level, numberNode);
            BitArray node = container.TreeNode(level, numberNode);

            bool haveOne = false;
            for (int i = 0; i < branchSize; ++i)
            {
                if (container.CountConnectedBlocks(node, branchSize, i) == 0)
                {
                    SortedDictionary<Double, Double> array = ConnectedSubgraphsInCluster(level + 1,
                        branchStart + i);

                    foreach (KeyValuePair<Double, Double> kvt in array)
                    {
                        if (retArray.Keys.Contains(kvt.Key))
                            retArray[kvt.Key] += kvt.Value;
                        else
                            retArray.Add(kvt.Key, kvt.Value);
                    }
                }
                else
                {
                    haveOne = true;
                }
            }

            if (haveOne)
            {
                EngineForConnectedComp engForConnectedComponent = new EngineForConnectedComp();
                Dictionary<int, ArrayList> nodeMadrixList = container.NodeAdjacencyLists(node, branchSize);

                Dictionary<int, ArrayList> connComp = engForConnectedComponent.GetConnSGraph(nodeMadrixList, branchSize);
                Double countConnElements = 0;
                for (int i = 0; i < connComp.Count; ++i)
                {
                    if (connComp[i].Count > 1)
                    {
                        countConnElements = 0;
                        for (int j = 0; j < connComp[i].Count; ++j)
                        {
                            countConnElements += container.CountLeaves(level + 1,
                                branchStart + (int)connComp[i][j]);
                        }

                        if (retArray.Keys.Contains(countConnElements))
                        {
                            retArray[countConnElements] += 1;
                        }
                        else
                        {
                            retArray.Add(countConnElements, 1);
                        }
                    }
                }
            }

            return retArray;
        }