【问题标题】:Visualize a binary tree in VS在 VS 中可视化二叉树
【发布时间】:2012-07-25 15:26:29
【问题描述】:

我正在实现一个包含一些二叉树的 C# 程序。

Visual Studio 中是否有一些可用于调试的插件?

我需要它在运行时绘制树。

【问题讨论】:

  • 你会在哪里画呢?在visualizer?
  • @MarkByers 嗯,听起来不错,你知道这样的可视化工具吗?还是我应该从头开始写?我不确定这是否值得努力......

标签: c# visual-studio debugging tree


【解决方案1】:

这是一个简单的二叉树,它带有一种将其转换为字符串表示的方法。您可能有自己的二叉树类,但您可以使用相同的通用算​​法。

这里我使用一个标签来分隔每个节点。如果每个节点的内容的ToString 大于 8 (?) 个字符,您可能需要使用更多的空格、多个制表符,或者在每个节点的字符串开头添加一些字符来帮助您可视化它。

public class Node<T>
{
    public T Data { get; set; }
    public Node<T> Left { get; set; }
    public Node<T> Right { get; set; }

    public string displayNode()
    {
        StringBuilder output = new StringBuilder();
        displayNode(output, 0);
        return output.ToString();
    }

    private void displayNode(StringBuilder output, int depth)
    {

        if (Right != null)
            Right.displayNode(output, depth+1);

        output.Append('\t', depth);
        output.AppendLine(Data.ToString());


        if (Left != null)
            Left.displayNode(output, depth+1);

    }
}

然后实际使用它:

Node<string> root = new Node<string>() { Data = "root" };
root.Left = new Node<string>() { Data = "1" };
root.Right = new Node<string>() { Data = "2" };

root.Left.Left = new Node<string>() { Data = "3" };
root.Left.Right = new Node<string>() { Data = "4" };

Console.WriteLine(root.displayNode());

【讨论】:

    【解决方案2】:

    不是最好的方法,如果树很大,可能也不是很好,但你可以创建一个递归函数:

    public String ToString()
    {
        return id + "{" + a.ToString() + ";" + b.ToString() + "}";
    }
    

    其中:id当前节点的id,ab两个孩子

    编辑

    您需要绝对确定这是一棵树并且它不包含任何循环。

    【讨论】:

    • 值得注意的是,如果图包含任何循环,则根据定义,它不是二叉树(甚至根本不是树)。 OP 本身已经拥有您需要的所有约束。
    • 没错,但是当你需要调试的时候,可能是因为你的生成和/或其中的循环有问题,并且找到了在哪里或为什么。
    【解决方案3】:

    我发现在调试时从放大镜中获取二叉树的 DOT 表示并将其粘贴到任何 Graphviz 在线站点(例如 dreampuf.github.io/GraphvizOnline)非常有用。

    [DebuggerDisplay("{DebuggerDisplay}")]
    public class BinaryTree
    {
        private string DebuggerDisplay => GetDotRepresentation();
    
        public string GetDotRepresentation() {
            var sb = new StringBuilder();
    
            sb.AppendLine("digraph BST {");
            GetDotRepresentation(this.Root, sb);
            sb.AppendLine("}");
    
            return sb.ToString();
        }
    
        private void GetDotRepresentation(Node root, StringBuilder sb)
        {
            if (root == null) return;
    
            if (root.Left != null) {
                sb.AppendLine($"{root.Value} -> {root.Left.Value}");
            }
    
            if (root.Right != null)
            {
                sb.AppendLine($"{root.Value} -> {root.Right.Value}");
            }
    
            GetDotRepresentation(root.Left, sb);
            GetDotRepresentation(root.Right, sb);
        }
     }  
    

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      相关资源
      最近更新 更多