二叉树非递归遍历

来源:互联网 发布:itools mac版 破解 编辑:程序博客网 时间:2024/06/05 13:25

这里写出三种儿叉查询树遍历的非递归写法,非常有意思。

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