树是数据结构中非常重要的一部分,所有讲到数据结构和算法的书籍,都会讲到树。
那么,给定一个根节点,如何能够打印出完整的树结构呢?
这里说的打印,不只是像前序、中序和后序遍历中打印节点内容,我们要打的是整个树的结构。
如下是一段实现打印完整树结构的Java代码:
package tree; /** * 以可视化视图打印树结构 */ public class PrintTree { private static class Trunk { Trunk prev; String str; private Trunk(Trunk prev, String str) { this.prev = prev; this.str = str; } } // Helper function to print branches of the binary tree private static void showTrunks(Trunk p) { if (p == null) return; showTrunks(p.prev); System.out.print(p.str); } // 使用中序遍历方式打印二叉树 private static void traversalPrint(Node root, Trunk prev, boolean isLeft) { if (root == null) return; String ROOT_PREV = " "; String CHILD_PREV = " "; String LEFT_CHILD_CURVED_EDGE = ".---"; String LEFT_CHILD_STRAIGHT_EDGE = " |"; String RIGHT_CHILD_CURVED_EDGE = "`---"; String RIGHT_CHILD_STRAIGHT_EDGE = " |"; String prev_str = CHILD_PREV; Trunk trunk = new Trunk(prev, prev_str); // 遍历左子树 traversalPrint(root.left, trunk, true); if (prev == null) trunk.str = ROOT_PREV; else if (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); } public static void print(Node root) { traversalPrint(root, null, false); } public static void main(String[] args) { Node root = null; // Construct above tree root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.left = new Node(6); root.right.right = new Node(7); root.left.left.left = new Node(8); root.left.left.right = new Node(9); root.left.right.left = new Node(10); root.left.right.right = new Node(11); root.right.left.left = new Node(12); root.right.left.right = new Node(13); root.right.right.left = new Node(14); // print constructed binary tree PrintTree.print(root); } }
这段代码有一个main
测试方法,执行后打印:
.---8
.---4
| `---9
.---2
| | .---10
| `---5
| `---11
1
| .---12
| .---6
| | `---13
`---3
| .---14
`---7
其中,最左边对应树的跟节点,上面对应左子树,下面对应右子树。