You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多叉树按值排序打印输出不对称,请求修复方案

解决树的对称打印问题

看起来你遇到的核心问题是层序打印时的空格计算逻辑错误,导致节点无法对称排列。咱们先拆解问题,再给出针对性的修复方案。

现有代码的问题分析

你当前的inOrderSearch方法里,空格计算依赖(Math.pow(grad, heightOfTree(p) - 1)) * grad -1,这个逻辑既没考虑整个树的总高度,也没根据当前层的深度动态调整间距,最终导致上层节点的左右空格不对称,出现像10和12这类节点错位的情况。

要实现对称打印,核心要满足两个点:

  • 每一层的节点间距需要根据总树高和当前层深度动态计算,上层间距是下层的两倍左右,保证对称结构
  • 每一层开头需要有对应长度的前置空格,让整个层在控制台居中显示

修复后的代码实现

我们需要重写打印相关的方法,用更合理的间距计算逻辑:

替换原有的inOrderSearch和printTree方法

// 计算当前层节点之间的间隔空格数
private int getNodeSpacing(int currentLevel, int totalHeight) {
    // 最底层间隔设为2(可根据需求调整),上层间隔是下层的2倍+1,保证对称
    return (int) Math.pow(2, totalHeight - currentLevel + 1) - 1;
}

// 计算当前层的前置空格数,让整个层居中
private int getLeadingSpace(int currentLevel, int totalHeight) {
    return (int) Math.pow(2, totalHeight - currentLevel) - 1;
}

// 递归打印指定层级的节点,处理空节点占位
private void printLevelNodes(Node node, int currentLevel, int targetLevel, int spacing, int leadingSpace) {
    if (node == null) {
        // 空节点打印对应长度的空格占位,避免布局错位
        String emptyPlaceholder = " ".repeat(leadingSpace + (targetLevel == currentLevel ? 1 : 0) + spacing);
        System.out.print(emptyPlaceholder);
        return;
    }

    if (currentLevel == targetLevel) {
        // 打印当前节点值,用格式化保证对齐(如果节点值是多位数,把%1d改成%2d/%3d即可)
        System.out.print(String.format("%" + leadingSpace + "d", node.val));
        if (spacing > 0) {
            System.out.print(" ".repeat(spacing));
        }
    } else {
        // 递归打印子节点,调整子层的前置空格和间距
        int newLeading = leadingSpace / 2;
        int newSpacing = (spacing - 1) / 2;
        for (Node leaf : node.leaves) {
            printLevelNodes(leaf, currentLevel + 1, targetLevel, newSpacing, newLeading);
        }
    }
}

public void printTree() {
    if (root == null) {
        System.out.println("Empty tree");
        return;
    }
    int totalTreeHeight = heightOfTree(root);
    for (int level = 1; level <= totalTreeHeight; level++) {
        int nodeSpacing = getNodeSpacing(level, totalTreeHeight);
        int leadingSpace = getLeadingSpace(level, totalTreeHeight);
        printLevelNodes(root, 1, level, nodeSpacing, leadingSpace);
        System.out.println();
    }
}

关键修改点说明

  1. 动态间距计算:

    • getNodeSpacing根据当前层和总高度计算节点间的空格,上层节点的间距是下层的两倍,保证对称结构的连贯性
    • getLeadingSpace计算每一层开头的前置空格,让整个层在控制台居中显示
  2. 空节点占位处理:
    递归时遇到空节点,打印对应长度的空格占位,避免因为缺失节点导致后续节点布局偏移

  3. 节点对齐优化:
    使用String.format保证节点值的对齐,如果你的节点值是多位数,只需要调整格式化字符串的宽度(比如%2d)即可

测试验证

调用fill()填充节点后,再调用printTree(),就能得到你期望的对称布局了。比如3叉树(grad=3)、高度3的场景下,节点10和12会完美对称排列,和你提供的期望样式一致。

内容的提问来源于stack exchange,提问作者Havva Tecer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:18:57