在递归方法之后删除尾随空格
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());
}
}
我 运行 通过二叉树以特定顺序打印字符串元素,它实际上要求字符串的 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());
}
}