我创建了一个AVL树,使用Add和Remove方法。但是,我需要以可视化格式打印出树。例如,如果平衡树当前包含1、2、3,它看起来像这样:
3
2
1
有没有一种相对简单的方法可以做到这一点??(您可以假设在添加或删除值后,我的树将始终正确平衡。)
对于您想要的,有一个简单的算法,根据您的需求,它的效果不会太差。一般来说(即绘制节点),这个问题很难解决——如果我没有完全错的话,在3d中是NP难的(但也有一些很好的遗传算法)。
无论如何,我已经使用了类似的快速n’dirty来进行调试,但我认为它至少应该让你知道它是如何工作的(c代码,但这里的差异归结为不同的大写字母):
// Start Method
static internal string PrintTree(Node root) {
StringBuilder sb = new StringBuilder();
PrintTree(root, "", sb);
return sb.ToString();
}
static private void PrintTree(Node node, string indent, StringBuilder sb) {
sb.AppendLine(node.ToString());
if (node.LeftChild != null) {
if (node.RightChild == null) {
PrintLastChild(node.LeftChild, indent, sb);
}
else {
PrintNormalChild(node.LeftChild, indent, sb);
PrintLastChild(node.RightChild, indent, sb);
}
}
}
static private void PrintNormalChild(Node node, string indent, StringBuilder sb) {
sb.Append(indent);
sb.Append('├');
sb.Append('─');
PrintTree(node, indent + "│ ", sb);
}
static private void PrintLastChild(Node node, string indent, StringBuilder sb) {
sb.Append(indent);
sb.Append('└');
sb.Append('─');
PrintTree(node, indent + " ", sb);
}
如果你想以一种更典型的树的方式,你必须做一些预计算(基本上,因为你想把根节点放在树的中间,你必须知道计算必要的缩进级别和行的工作线的深度-如果效率不重要,应该不会太差)