📅  最后修改于: 2023-12-03 15:06:20.280000             🧑  作者: Mango
当我们需要将一棵二叉树以形象化的方式呈现时,二维打印二叉树就是一个不错的选择。它可以将二叉树的结构以可视化的方式表现出来,方便我们更好地理解和分析二叉树的性质和特点。
二维打印二叉树的实现思路可以分为以下几步:
为了使打印效果更美观,我们需要获取二叉树的深度和宽度。深度表示二叉树的层数,宽度表示最底层的节点个数。我们可以通过递归遍历二叉树来获取它们的值。
接下来我们需要将二叉树转化为字符串矩阵,以便我们对其进行打印。我们可以用一个二维数组来表示字符串矩阵,其中每个元素存放一个字符,代表着二叉树中的一个节点。
在生成矩阵时,我们需要注意一下问题:
最后一步就是根据生成的字符串矩阵打印出完整的二叉树。我们可以按照二维数组的形式遍历矩阵,将每个元素打印到控制台上即可。
下面是一个 Java 实现的二叉树二维打印示例代码,它可以将二叉树以可视化的方式输出:
public class PrintBinaryTree {
private int depth;
private int width;
private TreeNode root;
public PrintBinaryTree(TreeNode root) {
this.root = root;
this.width = getWidth(root);
this.depth = getDepth(root);
}
// 获取树的深度
private int getDepth(TreeNode node) {
if (node == null) {
return 0;
} else {
int leftDepth = getDepth(node.left);
int rightDepth = getDepth(node.right);
return Math.max(leftDepth, rightDepth) + 1;
}
}
// 获取树的宽度
private int getWidth(TreeNode node) {
if (node == null) {
return 0;
} else {
int leftWidth = getWidth(node.left);
int rightWidth = getWidth(node.right);
return leftWidth + rightWidth + 1;
}
}
// 将树转化为字符矩阵
private String[][] toMatrix(TreeNode node, int row, int start, int end) {
if (node == null) {
return null;
}
String[][] matrix = new String[row][width];
int mid = (start + end) / 2;
matrix[0][mid] = String.valueOf(node.val);
String[][] left = toMatrix(node.left, row - 1, start, mid - 1);
String[][] right = toMatrix(node.right, row - 1, mid + 1, end);
if (left != null) {
for (int i = 1; i < row; i++) {
for (int j = 0; j < width; j++) {
matrix[i][j] = " ";
if (j - (mid - start + 1) >= 0) {
matrix[i][j] = left[i - 1][j - (mid - start + 1)];
}
}
}
}
if (right != null) {
for (int i = 1; i < row; i++) {
for (int j = 0; j < width; j++) {
if (j + (mid - start + 1) < width) {
matrix[i][j] = right[i - 1][j + (mid - start + 1)];
}
}
}
}
return matrix;
}
// 打印树的字符矩阵
public void print() {
String[][] matrix = toMatrix(root, depth, 0, width - 1);
for (String[] row : matrix) {
for (String val : row) {
System.out.print(val);
}
System.out.println();
}
}
}
为了使用这个类,我们需要创建一个二叉树,并调用 print()
方法。
我们假设现在有一棵如下所示的二叉树:
1
/ \
2 3
/ \
4 5
那么我们可以通过调用打印方法,生成如下形式的输出:
1
/ \
2 3
/ \
4 5