这里写出三种儿叉查询树遍历的非递归写法,非常有意思。
preorder:先打印root,再left,最后right。
public static void BSTPreorderTraverse(Node node) {
if (node == null) {
return;
}
Stack<Node> s = new Stack<Node>();
s.push(node);
while (!s.empty()) {
node = s.pop();
System.out.println(node.toString());
if (node.rightChild != null) {s.push(node.rightChild);}
if (node.leftChild != null) {s.push(node.leftChild);}
}
}
Inorder: 先打印left,再root,最后right.
public static void BSTInorderTraverse(Node node) {
Stack<Node> s = new Stack<Node>();
while (!s.empty() || node != null) {
if (node != null) {
s.push(node);
node = node.leftChild;
} else {
node = s.pop();
System.out.println(node.toString());
node = node.rightChild;
}
}
}
Postorder: 先打印left,再right,最后root.
public static void BSTPostorderTraverse(Node node) {
if (node == null) return;
Stack<Node> s = new Stack<Node>();
Node cur = node;
while (true) {
if (cur != null) {
if (cur.rightChild != null) {
s.push(cur.rightChild);
}
s.push(cur);
cur = cur.leftChild;
continue;
}
if (s.empty()) return;
cur = s.pop();
if (cur.rightChild != null && !s.empty() && cur.rightChild == s.peek()) {
s.pop();
s.push(cur);
cur = cur.rightChild;
} else {
System.out.println(cur.toString());
cur = null;
}
}
}
class Node {
Node leftChild = null;
Node rightChild = null;
String name;
Node(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
参考:http://en.wikipedia.org/wiki/Inorder