📜  二维打印二叉树(1)

📅  最后修改于: 2023-12-03 15:06:20.280000             🧑  作者: Mango

二维打印二叉树

当我们需要将一棵二叉树以形象化的方式呈现时,二维打印二叉树就是一个不错的选择。它可以将二叉树的结构以可视化的方式表现出来,方便我们更好地理解和分析二叉树的性质和特点。

实现思路

二维打印二叉树的实现思路可以分为以下几步:

  1. 获取二叉树的深度和宽度

为了使打印效果更美观,我们需要获取二叉树的深度和宽度。深度表示二叉树的层数,宽度表示最底层的节点个数。我们可以通过递归遍历二叉树来获取它们的值。

  1. 生成二叉树的字符串矩阵

接下来我们需要将二叉树转化为字符串矩阵,以便我们对其进行打印。我们可以用一个二维数组来表示字符串矩阵,其中每个元素存放一个字符,代表着二叉树中的一个节点。

在生成矩阵时,我们需要注意一下问题:

  • 对于每个节点,我们需要自动计算它的空格数,以保证矩阵中每个节点所占的宽度相等。
  • 对于二叉树中没有节点的空缺部分,我们需要用空格进行补充。
  1. 打印字符串矩阵

最后一步就是根据生成的字符串矩阵打印出完整的二叉树。我们可以按照二维数组的形式遍历矩阵,将每个元素打印到控制台上即可。

代码实现

下面是一个 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   
参考链接
  1. https://www.blogjava.net/tools/articles/330462.html
  2. https://www.jianshu.com/p/bd70f4421a10