这里写出三种儿叉查询树遍历的非递归写法,非常有意思。
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;
- }
- }