多叉树按值排序打印输出不对称,请求修复方案
解决树的对称打印问题
看起来你遇到的核心问题是层序打印时的空格计算逻辑错误,导致节点无法对称排列。咱们先拆解问题,再给出针对性的修复方案。
现有代码的问题分析
你当前的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(); } }
关键修改点说明
动态间距计算:
getNodeSpacing根据当前层和总高度计算节点间的空格,上层节点的间距是下层的两倍,保证对称结构的连贯性getLeadingSpace计算每一层开头的前置空格,让整个层在控制台居中显示
空节点占位处理:
递归时遇到空节点,打印对应长度的空格占位,避免因为缺失节点导致后续节点布局偏移节点对齐优化:
使用String.format保证节点值的对齐,如果你的节点值是多位数,只需要调整格式化字符串的宽度(比如%2d)即可
测试验证
调用fill()填充节点后,再调用printTree(),就能得到你期望的对称布局了。比如3叉树(grad=3)、高度3的场景下,节点10和12会完美对称排列,和你提供的期望样式一致。
内容的提问来源于stack exchange,提问作者Havva Tecer
相关产品推荐
相关产品推荐

