私が読んでいる論文は、
関数を計算するための線形時間アルゴリズムがあることは簡単にわかります。
l()
ここでl()
、一番左の子を指定します (入力と出力の両方がツリーの後順トラバーサルになります)。ただし、ツリー内のノードの数が単純なO(n^2)
実装しか考えられません。n
例として、次のツリーを考えてみましょう。
a
/ \
c b
ポストオーダー トラバーサルでは、ツリーはc b a
. 対応する関数l()
は を与えるはずc b c
です。
これが時間内の私の実装O(n^2)
です。
public Object[] computeFunctionL(){
ArrayList<String> l= new ArrayList<String>();
l= l(this, l);
return l.toArray();
}
private ArrayList<String> l(Node currentRoot, ArrayList<String> l){
for (int i= 0; i < currentRoot.children.size(); i++){
l= l(currentRoot.children.get(i), l);
}
while(currentRoot.children.size() != 0){
currentRoot= currentRoot.children.get(0);
}
l.add(currentRoot.label);
return l;
}
ツリーは次のように作成されます。
public class Node {
private String label;
private ArrayList<Node> children= new ArrayList<Node>();
...