填充树的递归

时间:2011-03-18 01:43:31

标签: java recursion binary-tree morse-code

我有一个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,因为这是最终树的大小。

非常感谢任何建议或意见!!

谢谢!

1 个答案:

答案 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


递归通常用于traversalbinary search tree,但此树更类似于Trie,字母表中只有2个字符(即{{ 1}}和.)。树的构造规则(左-和右.)使得不必使用递归。