としてクラス定義を考える:非再帰N線ツリートラバーサル
class Node {
public Double value;
public List<Node> children;
}
非再帰的に以下のプログラムを翻訳:
public static void process(Node node) {
for (int i = 0; i < node.children.size(); i++) {
Node child = node.children.get(i);
if (child.value < node.value) {
process(child);
}
}
System.out.println(node.value);
for (int i = 0; i < node.children.size(); i++) {
Node child = node.children.get(i);
if (child.value >= node.value) {
process(child);
}
}
}
共通ツリートラバーサルアルゴリズムは、ここで適切であると思われるが、スタックポップは条件をチェックする必要があるからです。
本当に解決策は考えられません。
サンプルツリーを使用する場合のコードに示すように、私は次の出力を得る:
5.7 6.0 1.0 12.0 13.0 5.0 8.0 7.0 10.0 9.0 5.5 15.0 11.0 14.0
public class Node {
public Double value;
public List<Node> children;
public Node(Double value) {
this.value = value;
this.children = new ArrayList<Node>();
}
public void addChild(Node node) {
children.add(node);
}
public static Node createSample() {
Node node = new Node(10.0);
Node node1 = new Node(15.0);
Node node2 = new Node(6.0);
Node node3 = new Node(11.0);
Node node4 = new Node(14.0);
Node node5 = new Node(5.0);
node.addChild(node1);
node.addChild(node2);
node.addChild(node3);
node.addChild(node4);
Node node51 = new Node(8.0);
Node node52 = new Node(7.0);
node5.addChild(node51);
node5.addChild(node52);
node.addChild(node5);
Node node11 = new Node(9.0);
Node node12 = new Node(5.5);
node1.addChild(node11);
node1.addChild(node12);
Node node21 = new Node(5.7);
Node node22 = new Node(12.0);
node2.addChild(node21);
node2.addChild(node22);
Node node31 = new Node(13.0);
Node node32 = new Node(1.0);
node22.addChild(node31);
node22.addChild(node32);
return node;
}
}
ワウ!素晴らしい説明と解決策。私はこれがこのようなきれいな方法で解決できるとは決して考えません。どうもありがとう! – EricCui