public Bitmap RenderTree(DecisionTree tree, Size blockSize)
        {
            var descendents    = tree.Root.Descendents;
            var numberOfLeaves = descendents.Count(item => item.IsLeaf);
            var depth          = tree.Root.Descendents.Max(item => item.Depth);
            var offset         = new Size(50, 50);

            if (numberOfLeaves > 20)
            {
                tree.Options.MaxNumberOfTerminalNodes = 20;
                tree.Prune();
                descendents    = tree.Root.Descendents;
                numberOfLeaves = descendents.Count(item => item.IsLeaf);
                depth          = tree.Root.Descendents.Max(item => item.Depth);
            }

            var width  = ((2 * blockSize.Width) * numberOfLeaves) + 2 * (offset.Width);
            var height = ((blockSize.Height + 100) * (depth + 1)) + 2 * (offset.Height);

            blockSize.Height = blockSize.Height + 100;

            NodeRenderer nr       = new NodeRenderer(blockSize, offset);
            Bitmap       bitmap   = new Bitmap(width, height);
            Graphics     graphics = Graphics.FromImage(bitmap);

            graphics.FillRectangle(Brushes.White, 0, 0, width, height);

            var coordinates = GetCoordinates(tree.Root);

            foreach (var coordinate in coordinates)
            {
                var node = coordinate.Key;
                nr.RenderNode(graphics, coordinate.Value, node);
                if (!node.IsLeaf)
                {
                    foreach (var child in node.Children)
                    {
                        nr.RenderEdges(graphics, coordinate.Value, coordinates[child],
                                       string.Format("{0} {1}", DecisionTree.GetStringCondition(child.Condition),
                                                     child.ThreshHold));
                    }
                }
            }

            return(bitmap);
        }