这里写出三种儿叉查询树遍历的非递归写法,非常有意思。
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;
}
@Override
public String toString() {
return name;
}
}
三种非递归的二叉查找树遍历方式
本文详细介绍了三种非递归的二叉查找树遍历方法:前序遍历、中序遍历和后序遍历。通过使用栈数据结构,实现了这些遍历方式的迭代实现,提供了清晰的代码示例。
2283

被折叠的 条评论
为什么被折叠?



