可视化视图打印树结构Java版
树是数据结构中非常重要的一部分,所有讲到数据结构和算法的书籍,都会讲到树。
那么,给定一个根节点,如何能够打印出完整的树结构呢?
这里说的打印,不只是像前序、中序和后序遍历中打印节点内容,我们要打的是整个树的结构。
如下是一段实现打印完整树结构的Java代码:
packagetree;
/**
*以可视化视图打印树结构
*/
publicclassPrintTree{
privatestaticclassTrunk{
Trunkprev;
Stringstr;
privateTrunk(Trunkprev,Stringstr){
this.prev=prev;
this.str=str;
}
}
//Helperfunctiontoprintbranchesofthebinarytree
privatestaticvoidshowTrunks(Trunkp){
if(p==null)
return;
showTrunks(p.prev);
System.out.print(p.str);
}
//使用中序遍历方式打印二叉树
privatestaticvoidtraversalPrint(Noderoot,Trunkprev,booleanisLeft){
if(root==null)
return;
StringROOT_PREV="";
StringCHILD_PREV="";
StringLEFT_CHILD_CURVED_EDGE=".---";
StringLEFT_CHILD_STRAIGHT_EDGE="|";
StringRIGHT_CHILD_CURVED_EDGE="`---";
StringRIGHT_CHILD_STRAIGHT_EDGE="|";
Stringprev_str=CHILD_PREV;
Trunktrunk=newTrunk(prev,prev_str);
//遍历左子树
traversalPrint(root.left,trunk,true);
if(prev==null)
trunk.str=ROOT_PREV;
elseif(isLeft){
trunk.str=LEFT_CHILD_CURVED_EDGE;
prev_str=LEFT_CHILD_STRAIGHT_EDGE;
}else{
trunk.str=RIGHT_CHILD_CURVED_EDGE;
prev.str=prev_str;
}
showTrunks(trunk);
//打印当前节点
System.out.println(root.data);
if(prev!=null)
prev.str=prev_str;
trunk.str=RIGHT_CHILD_STRAIGHT_EDGE;
//遍历右子树
traversalPrint(root.right,trunk,false);
}
publicstaticvoidprint(Noderoot){
traversalPrint(root,null,false);
}
publicstaticvoidmain(String[]args){
Noderoot=null;
//Constructabovetree
root=newNode(1);
root.left=newNode(2);
root.right=newNode(3);
root.left.left=newNode(4);
root.left.right=newNode(5);
root.right.left=newNode(6);
root.right.right=newNode(7);
root.left.left.left=newNode(8);
root.left.left.right=newNode(9);
root.left.right.left=newNode(10);
root.left.right.right=newNode(11);
root.right.left.left=newNode(12);
root.right.left.right=newNode(13);
root.right.right.left=newNode(14);
//printconstructedbinarytree
PrintTree.print(root);
}
}
这段代码有一个main测试方法,执行后打印:
.---8 .---4 |`---9 .---2 ||.---10 |`---5 |`---11 1 |.---12 |.---6 ||`---13 `---3 |.---14 `---7
其中,最左边对应树的跟节点,上面对应左子树,下面对应右子树。
参考地址:PrintBinaryTreeStructurewithitscontentsinC++