給定的類定義爲:非遞歸正線樹遍歷
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