乐闻世界logo
搜索文章和话题

如何用Java打印二叉树图?

7 个月前提问
6 个月前修改
浏览次数18

1个答案

1

在Java中要打印一棵二叉树的图形表示,我们可以选择多种方法。下面我将提供一种常见的方法,即使用递归来进行层次遍历,并打印每一层的节点值。

具体步骤如下:

  1. 定义二叉树的节点:我们先定义一个TreeNode类,这个类包含整型值和两个指向其子节点的引用。

  2. 层次遍历的实现:使用队列来帮助我们实现层次遍历。队列初始包含根节点,然后按层次逐个输出节点的值,并将非空子节点推入队列。

  3. 打印节点:为了使输出更直观地反映树的结构,每一层的节点可以用一定的缩进或者前缀来表示,子节点位置相对于父节点的位置可以有所偏移。

下面是一个简单的实现例子:

java
import java.util.*; class TreeNode { int value; TreeNode left; TreeNode right; TreeNode(int value) { this.value = value; this.left = null; this.right = null; } } public class BinaryTreePrinter { public static void printNode(TreeNode root) { int maxLevel = BinaryTreePrinter.maxLevel(root); printNodeInternal(Collections.singletonList(root), 1, maxLevel); } private static void printNodeInternal(List<TreeNode> nodes, int level, int maxLevel) { if (nodes.isEmpty() || BinaryTreePrinter.isAllElementsNull(nodes)) return; int floor = maxLevel - level; int endgeLines = (int) Math.pow(2, (Math.max(floor - 1, 0))); int firstSpaces = (int) Math.pow(2, (floor)) - 1; int betweenSpaces = (int) Math.pow(2, (floor + 1)) - 1; BinaryTreePrinter.printWhitespaces(firstSpaces); List<TreeNode> newNodes = new ArrayList<TreeNode>(); for (TreeNode node : nodes) { if (node != null) { System.out.print(node.value); newNodes.add(node.left); newNodes.add(node.right); } else { newNodes.add(null); newNodes.add(null); System.out.print(" "); } BinaryTreePrinter.printWhitespaces(betweenSpaces); } System.out.println(""); for (int i = 1; i <= endgeLines; i++) { for (int j = 0; j < nodes.size(); j++) { BinaryTreePrinter.printWhitespaces(firstSpaces - i); if (nodes.get(j) == null) { BinaryTreePrinter.printWhitespaces(endgeLines + endgeLines + i + 1); continue; } if (nodes.get(j).left != null) System.out.print("/"); else BinaryTreePrinter.printWhitespaces(1); BinaryTreePrinter.printWhitespaces(i + i - 1); if (nodes.get(j).right != null) System.out.print("\\"); else BinaryTreePrinter.printWhitespaces(1); BinaryTreePrinter.printWhitespaces(endgeLines + endgeLines - i); } System.out.println(""); } printNodeInternal(newNodes, level + 1, maxLevel); } private static void printWhitespaces(int count) { for (int i = 0; i < count; i++) System.out.print(" "); } private static int maxLevel(TreeNode node) { if (node == null) return 0; return Math.max(BinaryTreePrinter.maxLevel(node.left), BinaryTreePrinter.maxLevel(node.right)) + 1; } private static boolean isAllElementsNull(List<TreeNode> list) { for (Object object : list) { if (object != null) return false; } return true; } public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); root.right.left = new TreeNode(6); root.right.right = new TreeNode(7); printNode(root); } }

这段代码定义了一个简单的二叉树,并通过printNode方法打印出一棵树的图形表示。每个节点的位置试图保持其二维结构,以便直观地显示树的层次和结构。

2024年6月29日 12:07 回复

你的答案