【发布时间】:2014-08-31 00:51:25
【问题描述】:
当提供字符串输入时,我对如何生成树的逻辑感到困惑。比如当我有以下形式的输入时-
(1 (2 (3) (4)) (5 (6) ())
表示树会是这样 -
1
/ \
2 5
/ \ /\
3 4 6 ()
我可以像 tree.add(data) 一样构建树,然后通过判断它是否大于或小于父节点来寻找要自我添加的新节点。但是我无法理解如何实现如何以二进制数据结构形式存储上述字符串。
这是我迄今为止尝试过的 -
public class BinaryTree {
static Node root;
public static void levelorder(Node<?> n) {
Queue<Node<?>> nodequeue = new LinkedList<Node<?>>();
if (n != null)
nodequeue.add(n);
while (!nodequeue.isEmpty()) {
Node<?> next = nodequeue.remove();
System.out.print(next.data + " ");
if (next.getLeft() != null) {
nodequeue.add(next.getLeft());
}
if (next.getRight() != null) {
nodequeue.add(next.getRight());
}
}
}
private static String[] breakString(String elements) {
int indexOfOpenBracket = elements.indexOf("(");
int indexOfLastBracket = elements.lastIndexOf(")");
String removedPString = elements.substring(indexOfOpenBracket + 1,
indexOfLastBracket);
String[] breakRemovedPString = removedPString.split(" ");
if (breakRemovedPString[1].contains("(")) {
add(breakRemovedPString[0], breakRemovedPString[1], breakRemovedPString[2]);
}
return breakRemovedPString;
}
static void add(String parent, String leftString, String rightString) {
Node<String> nodeToAdd = new Node<String>(parent);
if (root == null) {
root = nodeToAdd;
root.left = new Node<String>(leftString);
root.right = new Node<String>(rightString);
} else {
}
}
public static void main(final String[] args) {
String treeString = "(1 (2) (3))";
breakString(treeString);
levelorder(root);
System.out.println();
}
}
请为此问题提出一些实施建议。
【问题讨论】:
-
您必须使用额外的数据结构来解析和评估您的
String,就像堆栈一样。 -
@OzanDeniz 我发现在这种情况下如何使用队列很有趣。我只使用堆栈解决了这些练习。介意提供一个答案,所以我也可以学习?注意:此评论并非用于拖钓。
-
@Luiggi Mendoza ,如果您可以分享更多细节或暗示,因为您之前已经解决了此类练习,那将非常有帮助。
-
是的,你是对的。它是通过使用堆栈构建的。我只是想给出一个起点。我还没有实现,但也许它可以通过使用优先级队列来构建,但我知道事实并非如此。
标签: java tree binary-tree user-input traversal