这里写出三种儿叉查询树遍历的非递归写法,非常有意思。
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; } } }
Preorder: 先打印left,再right,最后root.
class Node {
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; } } }Node leftChild = null; Node rightChild = null; String name; Node(String name) { this.name = name; } @Override public String toString() { return name; } }