1
我创建了一个AVL树,并带有工作的添加和删除方法。但是,我需要以可视格式打印出树。例如,如果平衡树当前包含1,2,3会是这个样子:将AVL树打印到JTextPane:Java
3
2
1
有一个相对简单的方式做到这一点? (你可以假定在添加或删除一个值之后,我的树总是会被适当地平衡。)
我创建了一个AVL树,并带有工作的添加和删除方法。但是,我需要以可视格式打印出树。例如,如果平衡树当前包含1,2,3会是这个样子:将AVL树打印到JTextPane:Java
3
2
1
有一个相对简单的方式做到这一点? (你可以假定在添加或删除一个值之后,我的树总是会被适当地平衡。)
对于你想要的,有一个简单的算法,根据你的需求工作不会太差。在一般情况下(即绘制节点),这个问题很难解决 - 如果我没有完全错误地使用三维的NP(但也有一些好的遗传算法)。
反正我用过类似的东西快速ñ肮脏的调试目的,但我认为它应该至少给你一个想法如何可以工作(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);
}
如果你想要一个更典型的树状模式,你必须做一些预计算(基本上,因为你想要树中间的根节点,你必须知道深度来计算必要的缩排级别和工作线路 - 如果效率不重要,应该不会太差)
哪种方式起作用? – 2011-06-09 20:35:12