可视化视图打印树结构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++