我有一个Java类:BinaryTree< t>我从文件中填写如下:
E .
T -
I ..
N -.
M --
A .-
W .--
R .-.
S ...
etc (to end of alphabit)
BinaryTree:
setRight(BinaryTree) -sets the right element
setLeft(BinaryTree) -sets the left element
setRootElement(t) -sets the root element
getRight() -gets the right element
getLeft() -gets the left element
getRootElement() -gets the root element of the node IE/ a Character
size() -returns the size of the tree
这是我给出的BinaryTree类中唯一可用的方法
所以我想要做的是我想逐一阅读文件的每一行,获取字母和“莫尔斯代码”字符串。注意:我只能使用Scanner类来读取文件!
然后我想从文件的内容和一些规则递归填充这个树:
A“。”表示向左移动,因此文件的第一部分将表示带有“E”字符的节点到根的左侧
“ - ”表示向右粘贴,因此文件中的第二行将表示带有“T”字符的节点到根的右侧。
所以“W .--”意味着从一个节点向左移动'W'到左边的节点,然后向右一个节点然后移到该节点的右边。
最后树会看起来像:
tree http://i56.tinypic.com/339tuys.png
由于我是Recursion的新手,因此在使用扫描仪从文件读取时可视化如何递归填充树时遇到了很多麻烦。
我是否必须在别处读取文件并将信息传递给递归方法???
或者我可以在递归方法中正确读取文件吗?这似乎不可能。
另外,你会使用什么作为基础案例,我很想使用t.size()== 27,因为这是最终树的大小。
非常感谢任何建议或意见!!
谢谢!
答案 0 :(得分:1)
Scanner sc = new Scanner(new File(...));
while (sc.hasNext()) {
String letter = sc.next();
String morse = sc.next();
BinaryTree forPosition = theBinaryTree;
for(int i = 0; i < morse.length(); i++) {
if (morse.charAt(i) == '.') {
if(forPosition.getLeft() == NULL) {
forPosition.setLeft() = new BinaryTree();
}
forPosition = forPosition.getLeft();
}
else {
// similar
}
}
forPostion.setRootElement(letter);
}
一个奇怪的递归版本:
Scanner sc = new Scanner(new File(...));
while (sc.hasNext()) {
String letter = sc.next();
String morse = sc.next();
findTheNode (theBinaryTree, letter, morse);
}
forPostion.setRootElement(letter);
}
findTheNode (BinaryTree node, String letter, String morse) {
if (morse.length() == 0) {
node.setRootElement(letter);
return;
} // found
if (morse.charAt(0) == '.') {
if (node.getLeft() == NULL) {
node.setLeft() = new BinaryTree();
}
findTheNode (node.getLeft(), letter, morse.substring(1));
}
else {
// similar
}
}
希望以上两种工作。
结果可能看起来像this。
递归通常用于traversal和binary search tree,但此树更类似于Trie,字母表中只有2个字符(即{{ 1}}和.
)。树的构造规则(左-
和右.
)使得不必使用递归。