使用标准输入输出 import java.util.*; public class Main1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String text = scanner.nextLine(); scanner.close(); Solution.TreeNode inputData = parseStringTreeNode(text); Solution solution = new Solution(); Solution.TreeNode root = solution.invertTree(inputData); System.out.println(printTree(root)); } private static String printTree(Solution.TreeNode root) { if (root == null) { return "[]"; } StringBuilder sb = new StringBuilder(); sb.append("["); Queue<Solution.TreeNode> queue = new LinkedList<>(); queue.add(root); // 记录最后一个非 null 节点的位置 int lastNonNullIndex = -1; List<String> nodeValues = new ArrayList<>(); while (!queue.isEmpty()) { Solution.TreeNode current = queue.poll(); if (current != null) { nodeValues.add(String.valueOf(current.val)); lastNonNullIndex = nodeValues.size() - 1; queue.add(current.left); queue.add(current.right); } else { nodeValues.add("null"); } } // 构建最终的字符串,只保留到最后一个非 null 节点为止 for (int i = 0; i <= lastNonNullIndex; i++) { sb.append(nodeValues.get(i)); if (i < lastNonNullIndex) { sb.append(", "); } } sb.append("]"); return sb.toString(); } private static Solution.TreeNode parseStringTreeNode(String literal) { if (literal == null || literal.length() <= 2) { return null; } // 去掉首尾的方括号,然后分割字符串得到字符串数组 String[] elements = literal.substring(1, literal.length() - 1).split(",\\s*"); // 处理特殊情况,如果数组为空 if (elements.length == 0 || (elements.length == 1 && elements[0].isEmpty())) { return null; } // 创建根节点 Solution.TreeNode root = new Solution.TreeNode(Integer.parseInt(elements[0])); Queue<Solution.TreeNode> queue = new LinkedList<>(); queue.add(root); int i = 1; while (!queue.isEmpty() && i < elements.length) { Solution.TreeNode current = queue.poll(); // 处理左子节点 if (i < elements.length && !elements[i].equals("null")) { current.left = new Solution.TreeNode(Integer.parseInt(elements[i])); queue.add(current.left); } i++; // 处理右子节点 if (i < elements.length && !elements[i].equals("null")) { current.right = new Solution.TreeNode(Integer.parseInt(elements[i])); queue.add(current.right); } i++; } return root; } }
直接使用节点
import java.util.*; public class Main1 { public static void main(String[] args) { Solution.TreeNode root = new Solution.TreeNode(1); root.left = new Solution.TreeNode(3); root.right = null; root.left.left = null; root.left.right = new Solution.TreeNode(2); System.out.println(printTree(root)); }
private static String printTree(Solution.TreeNode root) { if (root == null) { return "[]"; } StringBuilder sb = new StringBuilder(); sb.append("["); Queue<Solution.TreeNode> queue = new LinkedList<>(); queue.add(root); List<String> nodeValues = new ArrayList<>(); while (!queue.isEmpty()) { Solution.TreeNode current = queue.poll(); if (current != null) { nodeValues.add(String.valueOf(current.val)); queue.add(current.right); // 注意先添加右子节点 queue.add(current.left); // 再添加左子节点 } else { nodeValues.add("null"); } } // 去除末尾的多余 "null" int lastNonNullIndex = nodeValues.size() - 1; while (lastNonNullIndex >= 0 && nodeValues.get(lastNonNullIndex).equals("null")) { lastNonNullIndex--; } // 构建最终的字符串,只保留到最后一个非 null 节点为止 for (int i = 0; i <= lastNonNullIndex; i++) { sb.append(nodeValues.get(i)); if (i < lastNonNullIndex) { sb.append(", "); } } sb.append("]"); return sb.toString(); }
两个打印的方法有区别