在递归方法之后删除尾随空格

Deleting trailing whitespaces after recursion methods

我 运行 通过二叉树以特定顺序打印字符串元素,它实际上要求字符串的 return 值,我只是遇到了问题摆脱尾随的 whitespaces,.trim() 将不起作用,因为它使用递归,因此在使用 7 个节点的测试用例中,它将有几个删除必要的 whitespace,我能想到的最佳解决方案是使用 if 语句删除 space 的最后一个索引,但它有同样的问题。这更像是一个与递归逻辑相关的问题。

正确答案:“a b d e c f g”

我的代码得到的答案是:“a b d ec fg”

public static String travel(TreeNode<String> root) {
        StringBuilder sb = new StringBuilder();
    
        if(root != null) {
            sb.append(root.getData() + " ");
            sb.append(travel(root.getLeft()));
            sb.append(travel(root.getRight()));
        }
        
        if(sb.length() > 2) {
            sb.deleteCharAt(sb.lastIndexOf(" "));
        }
        
        return sb.toString();
    }

这应该有效

public static String travel(TreeNode<String> root) {
    StringBuilder sb = new StringBuilder();

    if(root != null) {
        sb.append(root.getData());
        String left = travel(root.getLeft());
        String right = travel(root.getRight());
        if (left.length() > 0)
            sb.append(" " + left);
        if (right.length() > 0)
            sb.append(" " + right);
    }
    return sb.toString();
}

怎么样

public static String travel(TreeNode<String> root) {
    StringBuilder sb = new StringBuilder();

    if(root != null) {
        sb.append(root.getData());
        sb.append(" " + travel(root.getLeft()));
        sb.append(" " + travel(root.getRight()));
    }
    
    return sb.toString().trim();
}

您好像在写 preorder binary tree traversal

将字符串化加入算法会使函数负担过重,从而降低它的通用性。我建议 returning 一个列表,然后调用者可以自由地将它加入到一个字符串中,以他们希望的任何方式。如果这是算法挑战的一部分并且您的方法头是固定的,请编写一个辅助方法来执行递归并让样板方法将 returned 数组字符串化。

另一种使您的代码更通用的方法是 return 节点列表而不是它们的数据。同样,这使调用者可以灵活地对结果执行他们想要的操作。

顺便说一下,“Traverse”比“travel”更典型。

我将其保留为字符串,但最好将此方法编写为接受类型 T 的节点,并使结果 ArrayList<TreeNode>.

public static String preorderToString(TreeNode<String> root) {
    var result = new ArrayList<String>();
    traversePreorder(root, result);
    return String.join(" ", result);
}

public static void traversePreorder(
    TreeNode<String> root,
    ArrayList<String> result
) {
    if (root != null) {
        result.add(root.getData());
        traversePreorder(root.getLeft());
        traversePreorder(root.getRight());
    }
}