用Graphviz显示树
缘起
前几天不知道那根筋搭错,又拿出了大学时候买的一本讲算法的书翻了起来。想起当年学习Tree的时候,看着数据结构凭空去想那颗倒着的树。那个叫做苦啊。所以就像有没有什么办法让Tree自己画出这样的结构图出来。
动手
既然想到了,就动手做把。因为以前用Graphviz画过一点mindmap,类图之类的小东西。让我一下子就想到了,我只要能从Tree结构中方便的输出成一个能绘制出对应树结构的Graphviz脚本就可以。这应该是代价最小的做法。
呵呵,废话不多说了。看看的Tree的代码吧!
@Override
public String toString() {
StringBuffer strValue = new StringBuffer();
StringBuffer rout = new StringBuffer("{rank=same ");
if(getLeftTree() != null ) {
strValue.append(root).append(ARROW).append( getLeftTree().getTreeNode()).append(";\r").
append( getLeftTree());
rout.append(getLeftTree().getTreeNode() ).append(ARROW).append(EXTEND).append(root);
}
strValue.append(EXTEND).append(root).append("[label=\"\",width=.1,style=invis];\r");
strValue.append(root).append(ARROW).append(EXTEND).append(root).append("[style=invis];\r");
if(getRightTree() != null) {
strValue.append(root).append(ARROW).append( getRightTree().getTreeNode()).append(";\r").
append( getRightTree());
rout.append(ARROW).append(getRightTree().getTreeNode());
}
strValue.append(rout).append(" [style=invis] } ;\r");
return strValue.toString();
}
产生脚本的动作全部在这里完成了。我通过如下代码创建了一颗树
ITree<Integer> tree = new TreeImpl<Integer>(6);
tree.addNode(3);
tree.addNode(16);
tree.addNode(5);
tree.addNode(4);
tree.addNode(2);
tree.addNode(10);
tree.addNode(30);
最后得到的一副如下的图
呵呵,这样的话就可以随时查看树的结构了,我们所需要做的只是把object toString一下就可以。
附上一些文件
演示的录屏文件
完整的代码